【问题标题】:Correct Type annotation for __init____init__ 的正确类型注释
【发布时间】:2017-10-16 21:01:46
【问题描述】:

python 中__init__ 函数的正确类型注释是什么?

class MyClass:
    ...

以下哪个更有意义?

def __init__(self):
    # type: (None) -> None

def __init__(self):
    # type: (MyClass) -> MyClass

def __init__(self):
    # type: (None) -> MyClass

因为我们通常会实例化为myclass = MyClass(),但__init__ 函数本身没有返回值。

【问题讨论】:

  • 出于我自己的好奇心,这甚至是必要的/预期的吗?
  • @roganjosh 不,这是受支持的功能。我发现它很有用,因为它可以帮助我的 IDE(pycharm) 检测类型不匹配。 stackoverflow.com/questions/32557920/…
  • 但是您已将其标记为 2.7,它甚至不支持类型提示。不过,我的问题范围更广,我不确定它对__init__() 是否有用。
  • @roganjosh,你是对的,它在这个例子中没有用。但是,我通常会将其扩展到其他接受变量的__init__ 函数。我可以通过在 2.7 上安装打字和 pycharm 来使用一些功能。
  • @roganjosh Python 2 确实支持类型提示,请参阅 mypy docs 我认为应该尽可能添加类型,尤其是对于像 __init__ 和可调用类这样的东西。

标签: python python-2.7 typing


【解决方案1】:

self作为注释给出时应从注释中省略,__init__()应标记为-> None。这一切都在PEP-0484 中明确指定。

【讨论】:

  • PEP 484 说 return type 应该注释为-> None,而不是应该省略self
  • 确实没有明确说明该规则。但是给出的例子是here,省略了self
  • 这些示例显示 Python 3 代码在方法签名中使用 self-> None 作为返回类型,这是您应该做的。如果您希望与 Python 2 兼容,则可以将类型签名放入注释中,在这种情况下,您可以在注释类型签名中省略 self。你当然不会在方法参数中遗漏self,否则你会得到参数计数不匹配错误,因为第一个参数将取代self。无论您标记什么都没关系,按照惯例,它只是self。您可能是这个意思,但不清楚。
  • 您能否澄清一下“应该省略self”。实际上,您的意思不是省略self 参数,而是省略self 的类型提示?
  • 顺便说一下,mypy 允许在 __init__ 中省略 ` -> None` - 尽管进行了激烈讨论 - 因为 __init__ 只能具有此返回类型(用于类型检查 ` -> None`是自动追加的),见github.com/python/mypy/issues/604
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 2015-08-05
  • 2017-06-04
  • 1970-01-01
  • 2021-10-16
  • 2020-10-26
相关资源
最近更新 更多