相关疑难解决方法(0)

如何验证命名元组值?

我有一个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吗?是否矫枉过正?

python oop namedtuple python-3.x

8
推荐指数
1
解决办法
998
查看次数

在python数据类__init__方法中强制进行类型转换

我有以下非常简单的数据类:

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__手动编写该方法还是有一种简单的方法来实现此目的?

python python-dataclasses

7
推荐指数
4
解决办法
867
查看次数

使用文件强制转换和输入环境变量

对于我的所有项目,我在开始时加载所有 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 typing environment-variables visual-studio-code

7
推荐指数
2
解决办法
3699
查看次数

在参数化泛型中,isinstance和issubclass中的mypy差异从python 3.5到3.6

在我从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中进行?

python typing type-hinting python-3.x mypy

6
推荐指数
1
解决办法
1496
查看次数

如何在 Python 3.7 中验证类型属性

我想在实例创建后验证类型是否正确,我尝试使用@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)

oop python-3.x python-3.7

5
推荐指数
1
解决办法
5023
查看次数

如何强制执行数据类字段的类型?

在这段代码中:

import dataclasses

@dataclasses.dataclass
class MyClass:
    value: str

obj = MyClass(value=1)
Run Code Online (Sandbox Code Playgroud)

数据类MyClass使用不遵守value类型的值进行实例化。

是否有一种简单的方法(使用装饰器、dataclass装饰器或库中的参数)来强制字段的类型,以便我的示例中的最后一行引发 aValueError或类似的东西?以这种方式强制执行类型有什么主要缺点吗?

python python-3.x python-dataclasses

5
推荐指数
1
解决办法
3031
查看次数

是否有针对类型类型的规范“isinstance”实现?

您可以\xe2\x80\x99t 使用类型类型,例如Dict[str, int]在检查中isinstance

\n\n
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])\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,任何进行类型检查的库都需要能够执行类似的操作isinstance(myvar, Dict[str, int])(...我意识到它应该被称为与 不同的东西isinstance,这不是完全相同的事情)

\n\n

我觉得适用于打字的等效函数必须存在于某个地方,也许在mypy项目中?(但是里面\xe2\x80\x99s有很多复杂的代码,到目前为止我找不到\xe2\x80\x99)

\n\n

除了 mypy 之外,还有很多项目需要这个,例如像pydantic和 AFAICT 这样的库,它们都有复杂的手动实现,并且似乎有很多边缘情况(或者只是 …

python-3.x mypy python-typing pydantic

3
推荐指数
1
解决办法
1492
查看次数

有什么方法可以获取所有可能的 Python 类变量,包括没有值的变量?

我正在创建一个类来表示查询,如下所示:

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 validation class member

3
推荐指数
1
解决办法
167
查看次数