我有一个namedtuple 变量,它代表应用程序的版本(它的编号和类型)。但我想对值进行一些限制:
Version = namedtuple("Version", ["app_type", "number"])
version = Version("desktop") # i want only "desktop" and "web" are valid app types
version = Version("deskpop") # i want to protect from such mistakes
Run Code Online (Sandbox Code Playgroud)
我现在的解决方案是没有方法的原始类:
class Version:
def __init__(self, app_type, number):
assert app_type in ('desktop', 'web')
self.app_type = app_type
self.number = number
Run Code Online (Sandbox Code Playgroud)
它是pythonic吗?是否矫枉过正?
我有以下非常简单的数据类:
import dataclasses
@dataclasses.dataclass
class Test:
value: int
Run Code Online (Sandbox Code Playgroud)
我创建了该类的实例,但我使用了一个字符串而不是整数:
>>> test = Test('1')
>>> type(test.value)
<class 'str'>
Run Code Online (Sandbox Code Playgroud)
我真正想要的是强制转换为我在类定义中定义的数据类型:
>>> test = Test('1')
>>> type(test.value)
<class 'int'>
Run Code Online (Sandbox Code Playgroud)
我必须__init__手动编写该方法还是有一种简单的方法来实现此目的?
对于我的所有项目,我在开始时加载所有 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) 在我从python 3.5升级到python 3.6之前,这个工作:
import typing
issubclass(list, typing.List[int]) # returns True
isinstance([1, 2 ,3], typing.List[int]) # returns True
Run Code Online (Sandbox Code Playgroud)
现在在python 3.6中,这两个都引发了以下异常:
TypeError: Parameterized generics cannot be used with class or instance checks
Run Code Online (Sandbox Code Playgroud)
这是新的预期行为还是错误?如果打算如何执行检查,上面的代码在python 3.6中进行?
我想在实例创建后验证类型是否正确,我尝试使用@dataclass装饰器,但不允许我使用该__init__方法,我还尝试使用自定义类类型
还按照类型的顺序进行了一些验证(例如,如果是 a int,则field>0或者 if 是str干净的空格),我可以使用字典来验证类型,但我想知道是否有办法在 pythonic 中做到这一点方式
class Car(object):
""" My class with many fields """
color: str
name: str
wheels: int
def __init__(self):
""" Get the type of fields and validate """
pass
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或类似的东西?以这种方式强制执行类型有什么主要缺点吗?
您可以\xe2\x80\x99t 使用类型类型,例如Dict[str, int]在检查中isinstance:
Python 3.7.6 (default, Dec 30 2019, 19:38:28)\nType \'copyright\', \'credits\' or \'license\' for more information\nIPython 7.12.0 -- An enhanced Interactive Python. Type \'?\' for help.\n\nIn [1]: from typing import Dict\n\nIn [2]: myvar = {"a": 1}\n\nIn [3]: isinstance(myvar, Dict[str, int])\n---------------------------------------------------------------------------\nTypeError Traceback (most recent call last)\n<ipython-input-3-a8fee57141ae> in <module>\n----> 1 isinstance(myvar, Dict[str, int])\nRun Code Online (Sandbox Code Playgroud)\n\n然而,任何进行类型检查的库都需要能够执行类似的操作isinstance(myvar, Dict[str, int])(...我意识到它应该被称为与 不同的东西isinstance,这不是完全相同的事情)
我觉得适用于打字的等效函数必须存在于某个地方,也许在mypy项目中?(但是里面\xe2\x80\x99s有很多复杂的代码,到目前为止我找不到\xe2\x80\x99)
\n\n除了 mypy 之外,还有很多项目需要这个,例如像pydantic和 AFAICT 这样的库,它们都有复杂的手动实现,并且似乎有很多边缘情况(或者只是 …
我正在创建一个类来表示查询,如下所示:
class Query:
height: int
weight: int
age: int
name: str
is_alive: bool = True
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,某些变量一开始就使用默认值进行初始化,而其他变量则不然。
我想像这样实现可链接的设置器
def of_height(self, height):
self.height = height
return self
def with_name(self, name):
self.name = name
return self
...
Run Code Online (Sandbox Code Playgroud)
目标是从项目中的多个位置调用它,如下所示:
q = Query()
q.of_height(175).with_name("Alice")
Run Code Online (Sandbox Code Playgroud)
然后我想调用一个q.validate()来检查是否有任何字段不存在设置,然后再使用此查询调用 API。
我无法找到一种方法来动态检查所有可能的变量(无论是否设置),以检查是否有任何变量未设置。理想情况下,我不想实现validate每次在此类中添加可能的查询维度时都必须更改的对象。
python ×6
python-3.x ×5
mypy ×2
oop ×2
typing ×2
class ×1
member ×1
namedtuple ×1
pydantic ×1
python-3.7 ×1
type-hinting ×1
validation ×1