如何忽略类型检查并遵守 <80 个字符的行

Posted

技术标签:

【中文标题】如何忽略类型检查并遵守 <80 个字符的行【英文标题】:How both ignore type check and obey line <80 chars 【发布时间】:2019-08-17 22:34:28 【问题描述】:

我有这种数据类型,它只对相关数据进行分组。它应该是一个类似结构的东西,所以我选择了namedtuple

ConfigOption = namedtuple('ConfigOption', 'one two animal vehicle fairytale')

另一方面,namedtuple 没有默认值,所以我接受了another answer 中提出的黑客攻击。

ConfigOption.__new__.__defaults__ = (1, 2, "White Horse", "Pumpkin", "Cinderella")

显然,这会导致类型检查失败:error: "Callable[[Type[NT], Any, Any, Any, Any, Any], NT]" has no attribute "__defaults__"

因为我很清楚这是一个 hack,所以我告诉类型检查器,所以使用内联注释 # type: disable

ConfigOption.__new__.__defaults__ = (1, 2, "White Horse", "Pumpkin", "Cinderella")  # type: disable

此时……队伍变得太长了。我知道如何打破这一行,使其在语法上正确,同时让类型检查器跳过它:

# the ignore is on the wrong line
ConfigOption.__new__.__defaults__ = \
    (1, 2, "White Horse", "Pumpkin", "Cinderella")  # type: ignore

# unexpected indentation
ConfigOption.__new__.__defaults__ =  # type: ignore
    (1, 2, "White Horse", "Pumpkin", "Cinderella")

那么有没有办法从类型检查中排除单行,或者格式化这个长行,以便跳过类型检查,并且行长度符合 pep-8 标准?

【问题讨论】:

Python >= 3.7 具有命名元组的默认值。 docs.python.org/3/library/… 【参考方案1】:

有什么问题:

option_defaults = (1, 2, "White Horse", "Pumpkin", "Cinderella")
ConfigOption.__new__.__defaults__ = option_defaults  # type: ignore

【讨论】:

除了 pep-8 告诉我使用 OPTION_DEFAULTS,什么都没有。谢谢!【参考方案2】:

Enum 似乎遵循您需要的约束,并且非常简洁。

您可以使用Functional API,它本身就是semantics resemble namedtuple

>>> from enum import Enum
>>> Enum('ConfigOption', 'one two animal vehicle fairytale')
<enum 'ConfigOption'>
>>> ConfigOption = Enum('ConfigOption', 'one two animal vehicle fairytale')
>>> [c for c in ConfigOption]
[<ConfigOption.one: 1>, <ConfigOption.two: 2>, <ConfigOption.animal: 3>, <ConfigOption.vehicle: 4>, <ConfigOption.fairytale: 5>]

【讨论】:

以上是关于如何忽略类型检查并遵守 <80 个字符的行的主要内容,如果未能解决你的问题,请参考以下文章

忽略词缀检查器的大小写[重复]

试图从一个文本文件中的行创建一个地图[字符串,字符串],不断收到错误[复制]

使用 jshint 遵守最大长度设置

忽略导致错误的行

行类元素和块级元素的区别,并举例

检查字符串是不是包含模式,忽略位置。并返回项目匹配的索引