我可以指定独占类型吗?像这样的东西:
def foo(bar: Not[str]) -> None:
assert not isinstance(bar, str)
print(type(bar))
Run Code Online (Sandbox Code Playgroud) 我正在尝试这样做,但我不确定如何指定类型签名:
def initialize_signals(
self,
command: InitializeCommand,
initializers: Iterable[Union[
Tuple[SignalNode],
Tuple[SignalNode, Any, ...]
]]):
for x, *args in initializers:
potential_update = command.create_potential_update(x, *args)
Run Code Online (Sandbox Code Playgroud) 可以Callable用NoReturntype来注释吗?
我期望这样做的方式会产生错误:
from sys import exit
from typing import Callable, NoReturn
f: Callable[..., NoReturn] = exit
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/typing.py", line 755, in __getitem__ return self.__getitem_inner__(params) File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/typing.py", line 251, in inner return func(*args, **kwds) File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/typing.py", line 774, in __getitem_inner__ result = _type_check(result, msg) File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/typing.py", line 135, in _type_check raise TypeError(f"Plain {arg} is not valid as type argument") TypeError: Plain typing.NoReturn is not valid as …
我有一个示例函数:
from typing import Dict
def cool_func(foo: Dict[object, str], bar: bool, baz: float) -> None:
foo_type_error_msg = "foo must be a Dict[object, str]"
if not foo.isinstance(dict):
raise TypeError(foo_type_error_msg)
for s in foo.values():
if not s.isinstance(str):
raise TypeError(foo_type_error_msg)
# the rest of the function
Run Code Online (Sandbox Code Playgroud)
如何使用类型提示中指定的类型在运行时检查变量?请注意,我不想对其他变量严格要求(只需检查参数foo)。
如果您想知道,我想强制执行该类型,以便错误(由错误类型引起的)不会出现在某处,the rest of the function并使用户与默认错误消息混淆。
我希望我能拥有这样的东西:
def cool_func(foo: Dict[object, str], bar: bool, baz: float) -> None:
check_type('foo')
# the rest of the function
Run Code Online (Sandbox Code Playgroud)
或者至少
def cool_func(foo: Dict[object, str], bar: bool, baz: float) …Run Code Online (Sandbox Code Playgroud) 考虑typing.TypeVar直接来自打字文档的以下插图:
# mypytest.py
from typing import TypeVar
A = TypeVar("A", str, bytes) # I.e. typing.AnyStr
def longest(x: A, y: A) -> A:
"""Return the longest of two strings."""
# https://docs.python.org/3/library/typing.html
return x if len(x) >= len(y) else y
Run Code Online (Sandbox Code Playgroud)
调用mypy mypytest.py不会引发错误并退出 0。本示例中的目的是A可以是str或bytes,但返回类型将与传递的类型一致。
但是,当存在默认参数时,mypy 将引发错误:
def longest_v2(x: A = "foo", y: A = "bar") -> A:
return x if len(x) >= len(y) else y
Run Code Online (Sandbox Code Playgroud)
提高:
$ mypy mypytest.py
mypytest.py:11: error: …Run Code Online (Sandbox Code Playgroud) 我想向返回调用的视图函数添加类型注释redirect。redirect返回什么,我如何为我的视图函数添加注释?
我认为它可能是str,或redirect功能,但我不确定。
def setalarm() -> redirect:
# Retrieves the information to create new alarms.
return redirect("/")
Run Code Online (Sandbox Code Playgroud) 我有一个完全注释的项目。或者至少我希望如此,因为完全有可能在某个地方有一两个函数缺少类型注释。我怎样才能找到这样的函数(或任何其他代码块)?
我知道我可以这样做:
\nimport typing\n\nT = typing.TypeVar("T")\n\nclass MyGenericClass(Generic[T]):\n def a_method(self):\n print(self.__orig_class__)\n\nMyOtherGeneric[SomeBaseClass]().a_method()\nRun Code Online (Sandbox Code Playgroud)\n打印SomeBaseClass。也许,我会坚持这种能力来实现我最终想要做的事情(根据修改功能T),但我现在想知道这一切是如何工作的。
本来,我想访问基类型信息(T在实例化对象时或实例化后不久,而不是在其生命周期的后期访问类内部的基本类型信息( 的值)。
作为一个具体的例子,在下面的代码中,我想要一些东西来替换其中的任何一个?n?,这样我就可以获得值SomeOtherBaseClass,这样我就可以在对象生命周期的早期也许还有一些代码也需要高于其中一行。
import typing\n\nT = typing.TypeVar("T")\n\nclass MyOtherGenericClass(Generic[T]):\n def __init__(self, *args, **kwargs):\n print(?1?)\n \n def __new__(klass, *args, **kwargs):\n print(?2?)\n\nMyOtherGenericClass[SomeOtherBaseClass]()\nRun Code Online (Sandbox Code Playgroud)\n我试图根据 的值在实例化时(或者以某种方式,在实例化之后不久)设置一些实例变量T。我正在重新考虑我的方法,因为typing模块,特别是带有泛型的东西,似乎仍然处于不稳定的开发时期。
那么\xe2\x80\xa6 可能吗?一位用户指出,至少在 3.8 中,__orig_class__在 期间设置typing._GenericAlias.__call__,但是这是如何实现的__call__调用该方法呢?什么时候会发生这种情况?
相关阅读:
\n\n对于 Python 的None对象,使用类型提示None而不是其实际类型NoneType。来自文档:
请注意,作为类型提示的 None 是一种特殊情况,并被 type(None) 替换。
我觉得这令人困惑,没有给出进一步的解释。
有谁知道这背后的原因?
在慢慢掌握与 PyCharm 协作打字的窍门后,我发现自己经常使用该包。我喜欢它的灵活性以及它如何适应几乎任何用例。
在使用这个包时(也因为它非常有用),我考虑为str从数据库获取的某些 id 创建一个“包装类型”,并在整个项目中用作字典键。
这样,如果函数使用直接从数据库获取的 id 作为键来传递字典,则类型提示不仅会提示所需的类型,还会提供有关数据流和键结构的一些信息(如果不仅仅是一个),而是使用两个或多个数据库 ID 来组成字典键。
我认为选择的工具是NewType,因为它实际上创建了一个新类型,其名称可以在 PyCharms 工具提示中显示(与TypeAlias或只是不同PrimaryKey = str)。然而,正如文档中预测的那样,PyCharm 的静态类型检查器不接受创建的NewTypeasstr并引发类型警告。
"Expect '{NewType xy}' got 'str' instead".
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:有什么办法解决这个问题吗?
"Expect '{NewType xy}' got 'str' instead".
Run Code Online (Sandbox Code Playgroud)
在我目前参与的项目中,这将是可读性的巨大改进,因为整个事情正在收集不同细节级别的内容,每个级别都由数据库主键标识。但如果我不能让它与 PyCharm 一起工作,我认为这是不值得的。
python ×10
python-typing ×10
python-3.x ×4
mypy ×3
type-hinting ×2
assert ×1
flask ×1
generics ×1
pycharm ×1
python-3.5 ×1
types ×1