我希望在我的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"],这将是很多代码更改。我怎样才能做到这一点?如果可能的话,我想避免添加冗余字段。
我想知道如何使这个 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) 我正在寻找一种工具,可以将函数中已添加的类型注释添加到 PyCharm 生成的文档字符串中。
我已经在 JetBrains 上关注这个问题很长时间了,但这个问题似乎还没有取得任何进展。
我也看到了这篇文章,但它似乎太具体了,只适用于谷歌文档字符串。
我已经在 PyPI 上查看了这个包,但这与我需要的相反。我需要的是将参数中提供的类型提示添加到文档字符串中,而不是相反。
这可能与如何使 PyCharm 从函数定义中获取类型提示并在文档字符串中填充类型值有关?,但我只需要一个通用的解决方案,或者至少一个可以与 Numpy docstring 或 reStructuredText 配合使用并且可以与 PyCharm 很好地配合的解决方案。
我只是看到自己回来研究这个东西,希望能得到一些东西,但找不到我需要的东西。什么工具可以用于此目的?
我对类型提示和文档字符串的使用感到困惑。它们不是重复的信息吗?
例如:
def my_func(name: str):
"""
print a name.
Parameters
----------
name : str
a given name
"""
print(name)
Run Code Online (Sandbox Code Playgroud)
信息不是name: str给出了两次吗?
假设我们有一些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真的不喜欢,引发错误: …
我试图了解在键入函数时如何使用重载装饰器。如果我编写以下代码并通过 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(即整数)更广泛。
这里发生了什么?
我有以下结构的函数:
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) 设置示例:
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)?
我正在尝试匹配类型注释,例如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 来避免出现以下错误: …
为什么我会收到错误消息?我已经正确添加了类型,对吗?
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-typing ×10
python ×8
type-hinting ×7
mypy ×5
docstring ×2
python-3.x ×2
annotations ×1
json ×1
keyof ×1
pycharm ×1
python-3.10 ×1
python-3.9 ×1
regex ×1