标签: python-typing

向 Python TypedDict 添加属性

我希望在我的TypedDict对象中有一个别名,以便在运行时期间避免许多 if/else 检查(TypedDict在数据加载期间创建)。

我有这样的事情:

class PatientJson(TypedDict):
    id: int
    name: str
Run Code Online (Sandbox Code Playgroud)

我想添加user_id别名PatientJson,这将返回id. 这将使列表推导始终指向user_id而不是检查哪个 ID 存在。

但是,使用这段代码:

class PatientJson(TypedDict):
    id: int
    name: str

    @property
    def user_id(self) -> int
        return self.id
Run Code Online (Sandbox Code Playgroud)

我收到一个错误Invalid statement in TypedDict definition; expected 'field_name: field_type'。我发现 TypedDicts 不能有方法(链接 1,链接 2)。这也会改变语法,因为我必须使用patient.user_id而不是patient["user_id"],这将是很多代码更改。我怎样才能做到这一点?如果可能的话,我想避免添加冗余字段。

python json python-typing

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

如何键入提示 getter 仅允许 dict 的键?

我想知道如何使这个 getter 更加类型安全:

VALUES = {
   '1': 'One',
   '2': 'Two',
   '3': 'Three'
}


def get(key : str) -> str:
    return VALUES[key]
Run Code Online (Sandbox Code Playgroud)

str我希望有一个keyof VALUESand类型,而不是类型type(VALUES[key])。

get('4')应该抛出无效类型警告,因为该键不存在。不确定这对于 Python 是否可行,因为我确实生活在 TypeScript 仙境中......:-)

TypeScript 正确的样子应该是这样的:

VALUES = {
   '1': 'One',
   '2': 'Two',
   '3': 'Three'
}


def get(key : str) -> str:
    return VALUES[key]
Run Code Online (Sandbox Code Playgroud)

python type-hinting keyof python-typing

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

python 自动在文档字符串中添加类型提示

我正在寻找一种工具,可以将函数中已添加的类型注释添加到 PyCharm 生成的文档字符串中。

我已经在 J​​etBrains 上关注这个问题很长时间了,但这个问题似乎还没有取得任何进展。

我也看到了这篇文章,但它似乎太具体了,只适用于谷歌文档字符串。

我已经在 PyPI 上查看了这个包,但这与我需要的相反。我需要的是将参数中提供的类型提示添加到文档字符串中,而不是相反。

这可能与如何使 PyCharm 从函数定义中获取类型提示并在文档字符串中填充类型值有关?,但我只需要一个通用的解决方案,或者至少一个可以与 Numpy docstring 或 reStructuredText 配合使用并且可以与 PyCharm 很好地配合的解决方案。

我只是看到自己回来研究这个东西,希望能得到一些东西,但找不到我需要的东西。什么工具可以用于此目的?

docstring type-hinting pycharm python-3.x python-typing

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

打字和文档字符串中存在重复信息?

我对类型提示和文档字符串的使用感到困惑。它们不是重复的信息吗?

例如:

def my_func(name: str):
    """
    print a name.
    
    Parameters
    ----------
    name : str
       a given name
    """
    print(name)
Run Code Online (Sandbox Code Playgroud)

信息不是name: str给出了两次吗?

python docstring type-hinting python-typing

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

如何正确键入提示类装饰器?

假设我们有一些func将类的实例映射A到类的实例的函数B,即它具有签名Callable[[A], B]。

我想autofunc为子类编写一个类装饰器,在创建实例时A自动应用于实例。func例如,考虑基于全局环境变量的自动 jit 编译。这可以通过以下方式完成

from functools import wraps

def autofunc(basecls):
    @wraps(basecls, updated=())

    class WrappedClass(basecls):
        def __new__(cls, *args, **kwargs):
            instance = basecls(*args, **kwargs)
            return func(instance)
    return WrappedClass
Run Code Online (Sandbox Code Playgroud)

那么下面两条大致等价:

class C(A):
...

instance = func(C())

@autofunc
class C(A):
...

instance = C()

出于我的天真,我尝试过

def autofunc(basecls: type[A]) -> type[B]:

    @wraps(basecls, updated=())
    class WrappedClass(basecls):

        def __new__(cls, *args, **kwargs):
            instance = basecls(*args, **kwargs)
            return func(instance)

    return WrappedClass
Run Code Online (Sandbox Code Playgroud)

这mypy真的不喜欢,引发错误: …

type-hinting mypy python-typing python-3.9 python-3.10

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

Mypy 错误:“重载函数签名 2 将永远不会匹配:签名 1 的参数类型相同或更广泛”

我试图了解在键入函数时如何使用重载装饰器。如果我编写以下代码并通过 mypy 运行它:

from typing import Union, overload

@overload
def myfunc(a: float, b: float) -> float: ...
@overload
def myfunc(a: int, b: int) -> int: ...

def myfunc(a: Union[float, int], b: Union[float, int]) -> Union[float, int]:
    return a + b
Run Code Online (Sandbox Code Playgroud)

然后我收到“错误:重载函数签名 2 永远不会匹配:签名 1 的参数类型相同或更广泛在 1 个文件中发现 1 个错误(已检查 1 个源文件)”

我不明白为什么签名 1(即浮点数)的参数类型比签名 2(即整数)更广泛。

这里发生了什么?

python type-hinting mypy python-typing

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

正确键入可以返回提供的默认值的函数

我有以下结构的函数:

def get_something_from_data(data: Mapping[str, str], default: Optional[str] = None) -> Optional[str]:
    """Get something out of `data` if it is there, if not return the value of `default`. 
    If `default` is not provided, return None.
    """
Run Code Online (Sandbox Code Playgroud)

因此,Optional[str]如果default省略,则可以返回,或者str如果default有str值,则始终返回。

现在我用类似于以下的代码调用它:

has_value = get_something_from_data(data, "fallback")
return has_value.endswith("k")
Run Code Online (Sandbox Code Playgroud)

即使在这种情况下始终has_value是an ,但运行此代码会生成错误,因为它认为可能是并且不会有。strmypyhas_valueNoneendswith

所以我尝试以不同的方式输入我的函数:

DT = TypeVar('DT', str, None)

def get_something_from_data(data: Mapping[str, str], default: DT = None) -> Union[str, DT]: …
Run Code Online (Sandbox Code Playgroud)

python type-hinting mypy python-typing

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

用于限制对象中属性类型的函数(Python、mypy)

设置示例:

from typing import Optional


class A(object):
    def __init__(self):
        self.a: Optional[int] = None
        
    def check_a(self) -> bool:
        return self.a is not None
        
a = A()
if a.check_a():
    print(a.a + 1)  # error: Unsupported operand types for + ("None" and "int")
Run Code Online (Sandbox Code Playgroud)

该check_a方法检查变量的类型a,但mypy没有看到这一点并写入错误。TypeGuard不会有帮助,因为它可以创建一个函数来检查类型,而不是一个函数来检查对象变量的类型

是否有可能以某种方式让 mypy 注意到这一点,以便使用该函数检查变量的类型,self.a而无需在检查中显式引用它?(使用if a.a_check而不是if a.a is not None)?

python type-hinting mypy python-typing

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

正则表达式匹配“|” 联合类型的分隔值

我正在尝试匹配类型注释,例如int | str,并使用正则表达式替换将它们替换为 string Union[int, str]。

期望的替换(之前和之后):

  • str|int|bool->Union[str,int,bool]
  • Optional[int|tuple[str|int]]->Optional[Union[int,tuple[Union[str,int]]]]
  • dict[str | int, list[B | C | Optional[D]]]->dict[Union[str,int], list[Union[B,C,Optional[D]]]]

到目前为止我想出的正则表达式如下:

r"\w*(?:\[|,|^)[\t ]*((?'type'[a-zA-Z0-9_.\[\]]+)(?:[\t ]*\|[\t ]*(?&type))+)(?:\]|,|$)"
Run Code Online (Sandbox Code Playgroud)

您可以在 Regex Demo 上尝试一下。它并没有真正按照我想要的方式工作。到目前为止我注意到的问题:

  • 到目前为止,它似乎无法处理嵌套的 Union 条件。例如,int | tuple[str|int] | bool似乎会导致一场匹配,而不是两次匹配(包括内部 Union 条件)。

  • 正则表达式似乎]最后消耗了不必要的东西。

  • 可能是最重要的一个,但我注意到 Python 中的模块似乎不支持正则表达式子例程re。这是我想到使用它的地方。

附加信息

这主要是为了支持Python 3.7+ 的PEP 604语法,该语法需要前向声明(例如声明为字符串)注释才能支持,否则内置类型不支持该|运算符。

这是我想出的示例代码:

r"\w*(?:\[|,|^)[\t ]*((?'type'[a-zA-Z0-9_.\[\]]+)(?:[\t ]*\|[\t ]*(?&type))+)(?:\]|,|$)"
Run Code Online (Sandbox Code Playgroud)

对于 3.10 之前的 Python 版本,我使用__future__import 来避免出现以下错误: …

python regex annotations python-3.x python-typing

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

Mypy “Union[str, Dict[str, str]]”的索引类型“str”无效;预期类型“Union[int, slice]”

为什么我会收到错误消息?我已经正确添加了类型,对吗?

Invalid index type "str" for "Union[str, Dict[str, str]]"; expected type "Union[int, slice]"
Run Code Online (Sandbox Code Playgroud)

代码

from typing import List, Dict, Union

d = {"1": 1, "2": 2}

listsOfDicts: List[Dict[str, Union[str, Dict[str, str]]]] = [
    {"a": "1", "b": {"c": "1"}},
    {"a": "2", "b": {"c": "2"}},
]

[d[i["b"]["c"]] for i in listsOfDicts]
Run Code Online (Sandbox Code Playgroud)

python mypy python-typing

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