在下面的示例中,MyClass的init方法定义了属性self._user
,该属性可以选择UserInput
类型,并初始化为None
。实际的用户输入应由方法set_user
提供。由于某些实际原因,用户输入不能提供给方法__init__
。在提供用户输入后,可以调用其他方法x1M5N1x和x1M6N1x。
向专业Python程序员提问:我真的需要在每个使用self._user
的方法中添加assert ... not None
吗?否则,VS Code Pylance
类型检查将报告self._user
可能是None
。但是,我在PyCharm中尝试了相同的代码及其内置的类型检查。在那里没有出现这个问题。
作为专业的Python程序员,您更喜欢VS Code中的Pylance
类型检查,还是PyCharm中的内置类型检查?
先谢谢你。
class UserInput:
name: str
age: int
class MyClass:
def __init__(self):
self._user: UserInput | None = None
def set_user(self, user: UserInput): # This method should be called before calling any methods.
self._user = user
def method_1(self):
assert self._user is not None # do I actually need it
# do something using self._user, for example return its age.
return self._user.age # Will get warning without the assert above.
def method_2(self):
assert self._user is not None # do I actually need it
# do something using self._user, for example return its name.
2条答案
按热度按时间bvn4nwqk1#
我认为保留
assert
是最安全和最简洁的。毕竟,这取决于类的用户调用示例方法的顺序。因此,您不能保证self._user
不是None
。9rnv2umw2#
我认为在生产代码中使用
assert
是一种不好的做法。当出现问题时,您会得到大量的AssertionError
,但您没有任何上下文来说明为什么要做出这种Assert。如果
set_user()
应该被更早地调用,我会很想把用户放在__init__
方法中,但是同样的原则也适用。您已经声明将首先调用
set_user
,因此,如果用户为None,则将获得NoUserException
。如果我在写这篇文章,我不会在
MyClass
中进行NoneType检查,如果用户是None,我也不会调用set_user
。