是否可以在运行时检查参数类型提示?我想以类似于Scala案例类的方式使用Python数据类,并使用pureconfig
和HOCON配置文件。也就是说,我希望有一些可选参数,但需要在另一个类构造函数中检查它们。但是,我不知道如何获取参数是否是可选的。
from dataclasses import dataclass
from typing import Optional
@dataclass
class Params:
x: int
y: int
z: Optional[int] = None
params = Params(x=2, y=3)
假设我想在某个地方使用数据类Params
。如果我检查z
,我将得到NoneType
。如果我知道这个设计,也许我可以忽略任何错误。
# just some example code
if z is None and z is not Optional (not sure if or how to check this):
raise ValueError("z must be specified as an integer")
if z is None and z is optional:
return x ** 2 + y ** 2
elif z is not None:
return x ** 2 + y ** 2 + z ** 2
见下。我们的想法是使用__post_init__
并检查z
的注释。取消注释#z: int
,看看它是如何工作的。
from dataclasses import dataclass
from typing import Optional
@dataclass
class Params:
x: int
y: int
z: Optional[int] = None
#z: int
def __post_init__(self):
print('post init')
if self.z is None:
z_annotation = self.__annotations__['z']
none_is_ok = False
args = z_annotation.__dict__.get('__args__')
if args is not None:
for entry in args:
none_is_ok = entry == type(None)
if none_is_ok:
break
if not none_is_ok:
raise ValueError('z can not be None')
p: Params = Params(3, 5, None)
print(p)