【问题标题】:Python typing of class instance attributes as copies of input args类实例属性的 Python 类型作为输入参数的副本
【发布时间】:2021-02-07 12:04:38
【问题描述】:

在 Python 中使用打字就足够了:

class Something:
    def __init__(self, arg1: str, arg2: Union[str, int]):
        self.arg1 = arg1
        self.arg2 = arg2

还是应该输入所有内容?以下是否有优势,是编码约定吗?

class Something:
    def __init__(self, arg1: str, arg2: Union[str, int]):
        self.arg1: str = arg1
        self.arg2: Union[str, int] = arg2

【问题讨论】:

  • 由于这是基于意见的,因此对于 Stack Overflow,这似乎是 off-topic。您可以改为向codereview.stackexchange.com 发帖寻求建议,但请确保遵守他们的on-topic 规则。
  • @costaparas 它不一定是基于意见的。取决于某些官方编码风格和打字文档,答案可能仍然是确定的。

标签: python class variables typing


【解决方案1】:

这取决于您的类型检查器的智能程度,但我希望所有当前的 Python 检查器都能够从第一种形式推断出 arg1arg2 的类型。

请注意,您缺少返回类型注释-> None

class Something:
    def __init__(self, arg1: str, arg2: Union[str, int]) -> None:
        self.arg1 = arg1
        self.arg2 = arg2

例如,参见mypy documentation on Class basics

mypy 类型检查器会检测您是否尝试访问缺少的属性,这是一个非常常见的编程错误。为此,必须在类中定义或初始化实例和类属性。 Mypy 推断属性的类型

class A:
    def __init__(self, x: int) -> None:
        self.x = x  # Aha, attribute 'x' of type 'int'

a = A(1)
a.x = 2  # OK!
a.y = 3  # Error: 'A' has no attribute 'y'

(我的粗体强调)。

否则我更喜欢将实例属性注释放在类级别,它们更容易被其他开发人员看到并阅读:

class Something:
    arg1: str
    arg2: Union[str, int]

    def __init__(self, arg1: str, arg2: Union[str, int]) -> None:
        self.arg1 = arg1
        self.arg2 = arg2

在这里,这导致您不得不重复自己,但您可以考虑使用using the dataclasses module 来避免这种情况。

【讨论】:

  • 不错的答案。如果输入了至少一个 arg,Mypy 允许您省略多余的 -> None。我已经跟随你的领导了..
猜你喜欢
  • 2013-07-12
  • 1970-01-01
  • 2015-02-08
  • 2012-09-14
  • 2019-09-28
  • 2012-02-17
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多