一个用于flake8的插件,用于在您的程序中查找可能的问题和设计问题。包含不属于pyflakes和pycodestyle的警告。
项目描述
一个用于 flake8 的插件,用于在您的程序中查找可能存在的错误和设计问题。包含不属于 pyflakes 和 pycodestyle 的警告
bug·bear (bŭg′bâr′) n. 1. A cause of fear, anxiety, or irritation: *Overcrowding is often a bugbear for train commuters.* 2. A difficult or persistent problem: *"One of the major bugbears of traditional AI is the difficulty of programming computers to recognize that different but similar objects are instances of the same type of thing" (Jack Copeland).* 3. A fearsome imaginary creature, especially one evoked to frighten children.
人们认为这些代码检查不应该包含在主要的 Python 工具中,因为它们具有强烈的个人观点,并且没有 PEP 或标准支持。由于 flake8 被设计成可扩展的,这些代码检查的原始创建者认为插件是最好的方式。这导致了贡献者的开发速度更快,flake8 用户可以更灵活地部署。
安装
使用 pip 安装
pip install flake8-bugbear
然后它将作为 flake8 的一部分自动运行;您可以使用以下命令检查是否已导入:
$ flake8 --version
3.5.0 (assertive: 1.0.1, flake8-bugbear: 18.2.0, flake8-comprehensions: 1.4.1, mccabe: 0.6.1, pycodestyle: 2.3.1, pyflakes: 1.6.0) CPython 3.7.0 on Darwin
开发
如果您想提交一个 PR,我们这里有开发说明 在这里。
警告列表
B001:不要使用裸 except:,它也会捕获意外的事件,如内存错误、中断、系统退出等。建议使用 except Exception:。如果您确定自己在做什么,请明确地写出 except BaseException:。禁用 E722 以避免重复警告。
B002:Python 不支持一元前缀增量。写作 ++n 等同于 +(+(n)),这等于 n。您想要的是 n += 1。
B003:将值赋给 os.environ 不会清除环境。子进程将看到过时的变量,与当前进程不一致。使用 os.environ.clear() 或 Popen 的 env= 参数。
B004:使用 hasattr(x, '__call__') 来测试 x 是否可调用是不可靠的。如果 x 实现了自定义的 __getattr__ 或其 __call__ 本身不是可调用的,您可能会得到误导性的结果。使用 callable(x) 以获得一致的结果。
B005:使用 .strip() 与多字符字符串会误导读者。它看起来像是在删除子串。如果这是故意的,请将字符集移动到常量中。使用 .replace()、.removeprefix()、.removesuffix() 或正则表达式来删除字符串片段。
B006:不要使用可变数据结构作为参数默认值。它们是在函数定义时创建的。所有对函数的调用都重用该数据结构的一个实例,并在它们之间保留更改。
B007:循环控制变量在循环体内未使用。如果这是故意的,请以下划线开始命名。
B008:不要在参数默认值中执行函数调用。该调用仅在函数定义时执行一次。对您的函数的所有调用将重用该定义时函数调用的结果。如果这是故意的,请将函数调用分配给模块级变量,并使用该变量作为默认值。
B009:不要调用 getattr(x, 'attr'),而应使用正常的属性访问:x.attr。对于不存在的属性,省略对 getattr 的默认值将导致引发 AttributeError。如果您事先知道属性名称,使用 getattr 没有额外的安全性。
B010:不要调用 setattr(x, 'attr', val),而是使用正常的属性访问:x.attr = val。如果你提前知道了属性名称,使用 setattr 并没有额外的安全性。
B011:不要调用 assert False,因为 python -O 会移除这些调用。相反,调用者应该 raise AssertionError()。
B012:在 finally 块中使用 break、continue 或 return 会抑制异常或覆盖 try 或 except 块的返回值。要显式抑制异常,请在 except 块中这样做。要正确使用 break、continue 或 return,重构你的代码,使这些语句不在 finally 块中。
B013:长度为1的元组字面量是多余的。请写作 except SomeError: 而不是 except (SomeError,):。
B014:在 except (Exception, TypeError): 中存在冗余的异常类型。请写作 except Exception:,它将捕获完全相同的异常。
B015:无意义的比较。这个比较没有做任何事,只是浪费了CPU指令。要么在前面添加 assert,要么移除它。
B016:不能抛出一个字面量。你是想返回它还是抛出异常?
B017:应将 assertRaises(Exception) 和 pytest.raises(Exception) 视为邪恶。它们可能导致测试通过,即使被测试的代码由于打字错误从未被执行。对更具体的异常(内置或自定义)进行断言,或使用 assertRaisesRegex(如果使用 assertRaises),或添加 match 关键字参数(如果使用 pytest.raises),或使用带有目标的内容管理器形式(例如,with self.assertRaises(Exception) as ex:)。
B018:发现无用的表达式。要么将其赋值给变量,要么将其删除。注意,悬挂逗号会导致将某些内容解释为无用的元组。例如,在语句 print(".."), 中,是 (print(".."),),这是一个未赋值的元组。只需删除逗号即可清除错误。
B019:在方法上使用 functools.lru_cache 或 functools.cache 可能会导致内存泄漏。缓存可能保留实例引用,阻止垃圾回收。
B020:循环控制变量覆盖了它迭代的可迭代对象。
B021:f-string 用作文档字符串。这将被 Python 解释为连接的字符串,而不是文档字符串。
B022:没有传递参数给 contextlib.suppress。不会抑制任何异常,因此此上下文管理器是多余的。注意,此规则目前不会标记与用户定义函数名称相似的 suppress 调用,以避免由于潜在的误报而导致的假阳性。
B023:在循环内部定义的函数不得使用在循环中重新定义的变量,因为 延迟绑定闭包是一个经典的陷阱。
B024:抽象基类有方法,但没有一个是抽象的。这不一定是一个错误,但你可能忘记添加 @abstractmethod 装饰器,可能还与 @classmethod、@property 和/或 @staticmethod 一起使用。
B025:在 try-except 块中发现了重复的异常。此检查确定了在多个 except 子句中指定的异常类型。第一个指定是唯一被考虑的,所以所有其他的都可以删除。
B026:关键字参数之后的星号解包强烈不建议使用,因为这仅在关键字参数被声明在解包序列提供的所有参数之后时才有效,这种顺序的改变可能会让读者感到惊讶和误导。曾经有关于禁止这种语法的cpython 讨论记录,但由于旧的使用习惯和解析器限制,这使得它变得困难。
B027:在抽象基类中存在空方法,但没有使用抽象装饰器。考虑添加 @abstractmethod。
B028:未找到显式的 stacklevel 参数。来自 warnings 模块的 warn 方法默认使用 stacklevel 为 1。这将只显示调用 warn 方法的行的堆栈跟踪。因此,建议使用 stacklevel 为 2 或更大,以向用户提供更多信息。
B029:使用空的元组 except (): 并不处理/捕获任何异常。添加异常以进行处理。
B030:异常处理程序应该是异常类或异常类元组的。
B031:多次使用 itertools.groupby() 返回的生成器在第二次使用时不会做任何事情。如果结果需要多次使用,请将其保存到列表中。
B032:可能存在无意中的类型注解(使用 :)。您是想使用 = 进行赋值吗?
B033:集合不应包含重复项。运行时将用单个项替换重复项。
B034:调用 re.sub、re.subn 或 re.split 应传递 flags 或 count/maxsplit 作为关键字参数。通常假设 flags 是第三个位置参数,而忽略了 count/maxsplit,因为许多其他 re 模块函数的形式是 f(pattern, string, flags)。
B035:发现具有静态键的字典推导式 - 要么是常量值,要么是从推导式表达式之外的变量。这将导致只有一个键的字典,该键被反复覆盖。
B036:发现 except BaseException: 而没有重新抛出(except 块的最顶层没有 raise)。这会捕获所有各种东西(Exception、SystemExit、KeyboardInterrupt...),可能会阻止程序按预期退出。
B037:在类 __init__() 方法中找到 return <value>、yield、yield <value> 或 yield from <value>。不应返回或产生任何值,只有裸 return 是允许的。
B038:已移动到 B909 - 在循环体内部发现了可变循环可迭代对象的变异。对循环的可迭代对象(如对 list.remove() 或通过 del)的调用可能会引起意外的错误。
B039:ContextVar 具有可变字面量或函数调用作为默认值。这只会评估一次,并且所有后续对 .get() 的调用都将返回相同的默认实例。这使用了与 B006 和 B008 相同的逻辑,包括在 extend-immutable-calls 中忽略值。
B040:捕获了异常,但在调用 add_note 时没有使用。您忘记重新抛出它了吗?
有争议的警告
以下警告默认禁用,因为它们具有争议性。这些可能适用于您,也可能不适用。如果您发现它们有用,请在您的配置中明确启用它们。下面将介绍如何启用。
B901:在生成器函数中使用 return x 在 Python 2 中是语法无效的。在 Python 3 中,return x 可以与 yield from 结合用作生成器的返回值。从 Python 2 过来的用户可能会期望旧的行为,这可能导致错误。请使用原生的 async def 协程或使用 # noqa 标记同一行上的有意使用 return x。
B902:用于方法的第一个参数无效。对于实例方法使用 self,对于类方法(包括 __new__ 和 __init_subclass__)或元类的实例方法(检测为直接从 type 继承的类)使用 cls。
B903:对于只在 __init__ 方法中设置属性的数据类,请使用 collections.namedtuple(或 typing.NamedTuple)。如果属性应该是可变的,则在 __slots__ 中定义属性以节省每个实例的内存并防止意外在实例上创建额外的属性。
B904:在 except 子句中,使用 raise ... from err 或 raise ... from None 来区分异常处理中的错误。有关详细信息,请参阅 异常链教程。
B905:未设置显式 strict= 参数的 zip()。设置 strict=True 会导致结果迭代器在参数因长度不同而耗尽时引发 ValueError。
排除 itertools.count、itertools.cycle 和 itertools.repeat(times=None),因为它们是无限迭代器。
strict= 参数是在 Python 3.10 中添加的,因此不要为应能在 <3.10 上运行的代码启用此标志。更多信息:https://peps.pythonlang.cn/pep-0618/
B906:没有进一步调用 visit 函数的 visit_ 函数。这通常是一个错误,并且会阻止访问者递归到已访问节点的子节点。考虑在函数末尾添加调用 self.generic_visit(node)。仅在函数名中 visit_ 后的部分是具有非空 _fields 属性的有效 ast 类型时触发。这是为了让使用 ast 模块的开发者启用,例如 flake8 插件编写者。
B907:考虑将 f"'{foo}'" 替换为 f"{foo!r}",这既易于阅读,如果在 foo 中出现,也会转义引号。检查尝试过滤掉任何与 !r 无效的格式规范。如果您使用其他转换标志,例如 f"'{foo!a}'",则可以替换为 f"{ascii(foo)!r}"。目前尚未在
B908:包含如with self.assertRaises或with pytest.raises等异常断言的上下文不应有多个顶层语句。每个语句应在其自己的上下文中。这样,测试可以确保异常仅在您期望的精确语句中抛出。
B909:之前为B038 - 在循环体内部发现可变循环可迭代的变异。对循环的可迭代的更改,如对list.remove()或通过del的调用,可能导致意外的错误。
B950:行太长。这是
pycodestyle
的E501的实用等效项:它考虑“最大行长度”,但只有在超出值超过10%时才会触发。noqa和type: ignore注释将被忽略。您将不再因括号超出一格而被迫重新格式化代码。同时,如果您显著违反行长度,您将收到一条消息,说明实际限制是多少。这灵感来源于Raymond Hettinger的“超越PEP 8”演讲以及高速公路巡逻人员在您超速不到< 5mph时不会阻止您。禁用E501以避免重复警告。与E501一样,此错误忽略第一行的长shebangs以及位于自己一行的urls或路径#! long shebang ignored # https://some-super-long-domain-name.com/with/some/very/long/paths url = ( "https://some-super-long-domain-name.com/with/some/very/long/paths" )
B910:使用Counter()而不是defaultdict(int)以避免过度使用内存,因为当访问时,默认字典将记录缺失的键的默认值。
如何启用有见地的警告
要启用Bugbear的有见地检查(B9xx),请指定一个--extend-select命令行选项或在您的配置文件中指定extend-select=选项(需要flake8 >=4.0)
[flake8] max-line-length = 80 max-complexity = 12 ... extend-ignore = E501 extend-select = B950
Bugbear的一些检查需要禁用其他flake8检查 - 例如,在启用B950时必须禁用E501。
如果您希望为您启用所有可选警告(为您的配置提供未来保障!),请说B9而不是B950。您需要flake8 >=3.2才能使用此功能。
对于flake8 <=4.0,您需要使用命令行选项--select或在您的配置文件中使用选项select=。对于flake8 >=3.0,此选项是一个白名单(未列出的检查默认禁用),因此您必须明确指定您想要启用的所有检查(例如,select = C,E,F,W,B,B950)。
--extend-ignore命令行选项和配置文件选项extend-ignore=需要flake8 >=3.6。对于较旧的flake8版本,可以使用--ignore和ignore=选项。使用ignore将覆盖所有默认禁用的代码,因此您需要在配置中指定这些代码以使其静音。我认为这种行为是令人惊讶的,所以Bugbear的有见地警告需要明确选择。
注意:Bugbear对明确有见地警告选择的支持已被弃用,将在未来的版本中删除。建议您在flake8配置中使用extend-ignore和extend-select,以避免隐式更改选定的和/或忽略的代码。
配置
插件当前有以下设置
extend-immutable-calls:指定一个额外的不可变调用列表。当使用其他提供更多不可变调用的库时,这可能会很有用,除了由 flake8-bugbear 处理的那些。对这些方法的调用将不再引发 B008 或 B039 警告。
classmethod-decorators:指定一个装饰器列表,以将其方法标记为 classmethod,如 B902 所用。默认情况下,只检查 classmethod。当指定 @obj.name 装饰器时,它将与 name 或 obj.name 进行匹配。这功能类似于 pep8-naming <https://github.com/PyCQA/pep8-naming> 的处理方式,但默认设置不同,并且不支持指定属性,使得装饰器永远不会匹配指定的值 obj.name,即使它被 @obj.name 装饰。
例如
[flake8] max-line-length = 80 max-complexity = 12 ... extend-immutable-calls = pathlib.Path, Path classmethod-decorators = myclassmethod, mylibrary.otherclassmethod
测试 / Lint
只需运行
coverage run tests/test_bugbear.py
进行 linting
pre-commit run -a
许可证
MIT
变更日志
24.8.19
B910:实现以建议使用 Counter() 而不是 defaultdict(int) (#489)
B901:不要在显式生成器返回类型上触发 (#481)
B008:添加一些注释,重命名 b008_extend_immutable_calls (#476)
B040:添加带注释的异常,但未重新引发或使用 (#477)
B039,添加 ContextVar,其默认值为可变字面量或函数调用
B040:添加带注释的异常,但未重新引发 (#474)
在 Python 3.13 中运行测试
类型注解代码 (#481 + #483)
将哈希替换为 unsafe_hash (#486)
24.4.26
B909:修复影响可变容器造成误报的问题 (#469)
24.4.21
B950:添加关于忽略行长的 pragm 线注释 (#463)
B909:添加更多案例以检测 + 更多容器修改函数 (#460)
24.2.6
B902:从 B902 检查中删除名为 validator 和 root_validator 的装饰器 (#459)
B038:将 B038 改为 B909 并使其可选 (#456)
24.1.17
B038:将规则限制为仅对修改函数进行限制 (#453)
24.1.16
B036:修复在 raise 语句中引发除裸名称之外的内容时的崩溃 (#450)
24.1.15
B038:添加对循环迭代器修改的检查 (#446)
B037:添加对 __init__() 中返回或产生值的检查 (#442)
B017:使 B017 也适用于 BaseException (#439)
B036:添加对未重新引发的 except BaseException 的检查 (#438)
23.12.2
B018:在所有级别检测无用的语句 (#434)
B018:将类名添加到 b018 无用表达式输出 (#433)
B018:将元组包含在 b018 无用语句检查中 (#432)
23.11.28
B035:修复在命名表达式使用时出现的误报 (#430)
23.11.26
B035:添加对字典推导式中的静态键的检查 (#426)
B902:添加标准库元类的异常 (#415)
B017:修改以防止在直接从 pytest 导入 raises() 时出现误报 (#424)
B026:修复检查未触发的错误,调用者是属性的情况 (#420)
23.9.16
添加 –classmethod-decorators (#405)
修复 python 3.12 上 node_stack 的名称冲突 (#406)
使用 pypa/build 构建包 (#404)
23.7.10
添加 B034:re.sub/subn/split 必须通过关键字参数传递 flags/count/maxsplit。
修复 Python 3.12 上的崩溃和多个测试失败,所有这些问题都与 B907 检查有关。
声明支持 Python 3.12。
23.6.5
将 tox.ini 包含在 MANIFEST.in 中以进行 sdist。(#389)
改进 B033(重复的集合项) (#385)
23.5.9
添加 B033:检测集合中的重复项
添加 B908:检测 assertRauses 如上下文,仅具有可能引发的最顶层语句
添加 B028:允许显式将 stacklevel 作为位置参数分配
删除更多 < 3.8 的检查/断言
23.3.23
flake8-bugbear 现在是 >= 3.8.1 的项目,如 flake8>=6.0.0。这允许进行一些更现代的 AST 使用清理,以及更少的 CI 运行等。
B030: 修复某些不寻常的异常处理程序(例如 except a[0].b:)导致的崩溃。
添加 B033: 检查集合中的重复项。
23.3.12
B950: 现在忽略 'noqa' 和 'type: ignore' 注释。
B005: 在导入的模块上使用 strip() 方法时不要标记。
B030: 允许在异常处理程序中使用调用和星号表达式。
23.2.13
B906: 将 visit_Bytes、visit_Num 和 visit_Str 添加到被 B906 检查忽略的 visit_* 函数列表中。 ast.Bytes、ast.Num 和 ast.Str 节点都已弃用,但某些代码库可能仍使用它们以保持与 Python 3.7 的向后兼容性。
B016: 当抛出 f 字符串时发出警告。
添加 B028: 检查警告模块的 warn 方法上的显式 stacklevel 关键字参数。
添加 B029: 检查尝试使用空元组(即 except ():)与 except 一起使用的情况。
添加 B030: 检查异常处理程序只使用异常类或异常类的元组。修复某些罕见的异常处理程序上的崩溃。
添加 B031: 检查不要多次使用 itertools.groupby()。
添加 B032: 检查可能的非故意类型注解而不是赋值。
23.1.20
B024: 现在忽略没有任何方法的类。(#336)
B017: 当 pytest.raises() 有 match 参数时不要发出警告。(#334)
B906: 忽略具有无法包含 ast.AST 子节点的 _fields 属性的 visit_ 函数。(#330)
23.1.17
将 B028 重命名为 B907,使其成为可选的/有意见的。
23.1.14
添加 B906: visit_ 函数没有进一步调用 visit 函数。(#313)
添加 B028: 当 f 字符串中的格式化值被引号包围时建议使用 !r。(#319)
22.12.6
添加 B905: 没有显式 strict= 参数的 zip()。(#314)
B027: 忽略使用其他名称导入 typing 时的 @overload。(#309)
22.10.27
B027: 忽略 @overload 装饰器。(#306)
B023: 也修复了 map。(#305)
B023: 使用 filter、reduce、key= 和 return 避免误报。为 functools 添加了测试。(#303)
22.10.25
使 B015 和 B018 消息更加礼貌。(#298)
添加 B027: 在没有抽象装饰器的抽象基类中添加空方法。
多次修复 B024 的误报。
将 CI 移动到使用 tox。(#294)
移至使用 PEP621 / pyproject.toml 包。(#291)
在 3.11 中进行了测试。
22.9.23
添加 B026: 找到关键字参数后的参数解包。(#287)
移至使用 setup.cfg,类似于 flake8。(#288)
22.9.11
添加 B025: 找到重复的异常处理子句。(#284)
22.8.23
为 B024 添加错误代码到消息。(#276)
22.8.22
添加 B024: 没有抽象方法的抽象基类。(#273)
22.7.1
实现延迟绑定循环检查。(#265)
22.6.22
当 select / extend_select 为 None 时不要崩溃。(#261)
忽略 B020 的 lambda 参数。(#259)
修复 B021、B022 错误消息中的缺失空格错误。(#257)
22.4.25
忽略 b013 测试用例的黑边格式化。(#251)
B010 修复 lambda 误报。(#246)
B008 修复 lambda 函数的边缘情况。(#243)
22.3.23
B006 和 B008: 检测默认表达式中的任何级别的函数调用。(#239)
B020: 修复了推导式误报。(#238)
调整 B019 描述。(#237)
22.3.20
B022: contextlib.suppress 没有传递任何参数。(#231)
B021: f-string 用作文档字符串。(#230)
B020: 确保循环控制变量不会覆盖它迭代的可迭代对象。(#220)
B019: 检查类方法上的缓存装饰器 (#218)
修复长空字符串引发的崩溃 (#223)
22.1.11
B018: 忽略JoinedStr (#216)
构建通用的Python 3 wheels (#214)
B950: 添加与E501相同的特殊情况 (#213)
21.11.29
B018: 目前禁用字符串检查 (#209)
21.11.28
B904: 确保抛出异常与except在相同上下文中 (#191)
添加选项以扩展不可变调用列表 (#204)
更新B014: binascii.Error 现在被视为 ValueError 的子类 (#206)
添加简单的pre-commit配置 (#205)
使用3.10官方版本进行测试
将B018检查添加到查找无用声明的功能中 (#196, #202)
21.9.2
修复_to_name_str中except语句中的调用引发的崩溃 (#187)
更新B006: 列表、字典和集合推导式现在也被禁止 (#186)
21.9.1
更新B008: 白名单更多不可变函数调用 (#173)
移除Python兼容性警告 (#182)
添加B904: 检查except子句中的没有from的raise (#181)
添加Python 3.10测试以确保通过 (#183)
21.4.3
验证item_context.args中的元素是否为ast.Name类型用于b017
21.4.2
为b017的visit添加另一个hasattr()检查到.func
21.4.1
添加B017: 检查gotta-catch-em-all assertRaises(Exception)
21.3.2
修复try/except块中的元组扩展引发的崩溃 (#161)
21.3.1
修复B015中的语法错误 (#150)
确保浮点无穷大/NaN不会触发B008 (#155)
处理类方法中的位置参数 (#158)
20.11.1
在B014中正确支持异常别名 (#129)
添加B015: 无意义的比较 (#130)
移除对#noqa注释的检查 (#134)
忽略非类型异常类 (#135)
引入B016以检查抛出字面量 (#141)
将types.MappingProxyType()从B008中排除 (#144)
20.1.4
忽略B009/B010的关键字
20.1.3
对非标识符静音B009/B010
声明可能需要忽略可选的B9x检查
20.1.2
修复except (…):子句中的属性-属性错误 (#182)
20.1.1
对于B012,允许在finally子句中循环中的continue/break
对于B001,也检查except ():
引入B013和B014以检查except (…,)语句中的元组
20.1.0
警告在finally块中的continue/return/break (#100)
从B008的错误信息中移除一个冒号 (#96)
19.8.0
修复.travis.yml语法 + 添加Python 3.8 + 夜间测试
修复black格式化 + 通过CI强制执行
确保B901不应用于__await__方法
19.3.0
允许元类classmethod的第一个参数为‘mcs’(PyCharm默认值)
引入B011
引入B009和B010
从B008中排除不可变调用,如tuple()和frozenset()
对于B902,元类classmethod的第一个参数可以是“mcs”,与PyCharm首选名称匹配
18.8.0
使用black格式所有.py文件
检查关键字参数的不可变默认值
测试Python 3.7
18.2.0
打包修复
17.12.0
在trove分类器中毕业到生产/稳定
引入B008
17.4.0
错误修复:也检查异步函数的B006 + B902
17.3.0
引入B903(由Martijn Pieters贡献的补丁)
错误修复:B902现在强制在元类实例方法中使用cls,在元类类方法中使用metacls
17.2.0
引入B902
错误修复:有偏见的警告在Syntastic中不再不可见
错误修复:当使用带有完整三位错误代码的full three-digit错误代码在命令行中使用–select时,有偏见的警告仍然可见
16.12.2
错误修复:当用户在配置中指定ignore = 时,有偏见的警告不再被启用。现在它们需要像上面那样明确选择
16.12.1
错误修复:B007不再在for循环中的元组解包时崩溃
16.12.0
引入B007
错误修复:从错误格式中移除一个额外的冒号,这使Bugbear错误在Syntastic中不可见
在trove分类器中标记为“Beta”,已在生产中使用8+个月
16.11.1
引入B005
引入B006
引入了B950
16.11.0
修复bug:在生成器内的闭包中不要产生误报(B901)
在setup.py中优雅地处理Python 2的问题
16.10.0
引入了B004
引入了B901,感谢Markus!
将flake8约束更新为至少3.0.0
16.9.0
引入了B003
16.7.1
修复bug:在B306的警告中不要省略消息代码
将对pep8的依赖改为对pycodestyle的依赖,并将flake8约束更新为至少2.6.2
16.7.0
引入了B306
16.6.1
修复bug:在类体中包含元组解包的文件时不会崩溃
16.6.0
引入了B002、B301、B302、B303、B304和B305
16.4.2
打包herp derp
16.4.1
修复bug:在源包中包含测试(以便让所有人的setup.py test工作)
修复bug:在setup.py中显式以UTF-8格式打开README.rst,以适应其他默认编码的系统
16.4.0
首次发布版本
按日期版本化
项目详情
下载文件
下载适合您平台的应用程序。如果您不确定选择哪一个,请了解有关安装包的更多信息。
源代码分发
构建分发版
flake8_bugbear-24.8.19.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 9b77627eceda28c51c27af94560a72b5b2c97c016651bdce45d8f56c180d2d32 |
|
MD5 | 71e34774c1204def98029ecfbefabe48 |
|
BLAKE2b-256 | 00b380043856ed90ceef0e95c01ed12d6bb7d4d76356e526450f0a9aeeb0a7b7 |
flake8_bugbear-24.8.19-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 25bc3867f7338ee3b3e0916bf8b8a0b743f53a9a5175782ddc4325ed4f386b89 |
|
MD5 | 3d1a911f9998fe93b1052099dea07eed |
|
BLAKE2b-256 | 2b3c8885a79ae7bebfab19716969de9810722ff45354e4ccc974a090bc478eaa |