Python 3.7即将到来,我想测试一些奇特的新dataclass+打字功能.使用本机类型和typing模块中的类型,可以很容易地获得正确工作的提示:
>>> import dataclasses
>>> import typing as ty
>>>
... @dataclasses.dataclass
... class Structure:
... a_str: str
... a_str_list: ty.List[str]
...
>>> my_struct = Structure(a_str='test', a_str_list=['t', 'e', 's', 't'])
>>> my_struct.a_str_list[0]. # IDE suggests all the string methods :)
Run Code Online (Sandbox Code Playgroud)
但是我想要尝试的另一件事是在运行时强制类型提示作为条件,即不应该dataclass存在具有不正确类型的类型.它可以很好地实现__post_init__:
>>> @dataclasses.dataclass
... class Structure:
... a_str: str
... a_str_list: ty.List[str]
...
... def validate(self):
... ret = True
... for field_name, field_def in self.__dataclass_fields__.items():
... actual_type = type(getattr(self, …Run Code Online (Sandbox Code Playgroud) 对于我的所有项目,我在开始时加载所有 env 变量,并检查所有预期的键是否存在,如.env.example遵循dotenv-safe 方法的文件所述。
然而,env 变量是字符串,每当它们在 Python 代码中使用时都必须手动转换。这很烦人且容易出错。我想使用.env.example文件中的信息来转换 env 变量并在我的 IDE (VS Code) 中获得 Python 输入支持。我怎么做?
环境示例
PORT: int
SSL: boolean
Run Code Online (Sandbox Code Playgroud)
Python 理想行为
# Set the env in some way (doesn't matter)
import os
os.environment["SSL"] = "0"
os.environment["PORT"] = "99999"
env = type_env()
if not env["SSL"]: # <-- I'd like this to be cast to boolean and typed as a boolean
print("Connecting w/o SSL!")
if 65535 < env["PORT"]: # <-- I'd like this to …Run Code Online (Sandbox Code Playgroud) 在这段代码中:
import dataclasses
@dataclasses.dataclass
class MyClass:
value: str
obj = MyClass(value=1)
Run Code Online (Sandbox Code Playgroud)
数据类MyClass使用不遵守value类型的值进行实例化。
是否有一种简单的方法(使用装饰器、dataclass装饰器或库中的参数)来强制字段的类型,以便我的示例中的最后一行引发 aValueError或类似的东西?以这种方式强制执行类型有什么主要缺点吗?