假设我有一个功能:
def get_some_date(some_argument: int=None) -> %datetime_or_None%:
if some_argument is not None and some_argument == 1:
return datetime.utcnow()
else:
return None
Run Code Online (Sandbox Code Playgroud)
如何为可能的内容指定返回类型None?
如何使用类型提示来注释返回一个Iterable总是产生两个值的函数:a bool和a str?提示Tuple[bool, str]很接近,除了它将返回值类型限制为元组,而不是生成器或其他类型的可迭代.
我很好奇,因为我想注释一个foo()用于返回多个值的函数,如下所示:
always_a_bool, always_a_str = foo()
Run Code Online (Sandbox Code Playgroud)
通常函数喜欢foo()做这样的事情return a, b(它返回一个元组),但我喜欢的类型暗示有足够的灵活性,以取代发电机或列表或别的东西返回的元组.
在Python文档字符串中,如何记录:rtype:可以返回多种可能数据类型的函数?
例如,如果函数可以返回defaultdictOR dictOR list,则根据函数参数,您如何记录这个?
代码示例:
from collections import defaultdict
def read_state(state_file, state_file_type='defaultdict'):
"""Deserialize state file or create empty state and return it.
:param state_file: The path and file name of state file to read.
:type state_file: str
:param state_file_type: Data type in which state is stored.
:type state_file_type: str
:return: Current or new empty state.
:rtype: ?????
"""
if os.path.exists(state_file):
with open(state_file) as conf_fo:
state = json.load(conf_fo)
elif state_file_type == 'defaultdict':
state = defaultdict(lambda: …Run Code Online (Sandbox Code Playgroud) 我有一个Python函数,它接受XML数据作为str.
为方便起见,该功能还会检查xml.etree.ElementTree.Element并str在必要时自动转换为.
import xml.etree.ElementTree as ET
def post_xml(data: str):
if type(data) is ET.Element:
data = ET.tostring(data).decode()
# ...
Run Code Online (Sandbox Code Playgroud)
是否可以使用类型提示指定参数可以作为两种类型之一给出?
def post_xml(data: str or ET.Element):
# ...
Run Code Online (Sandbox Code Playgroud) 我理解(如这个问题和文档中所解释的)X or 的类型提示Y可以表示为:
Union[X,Y]
Run Code Online (Sandbox Code Playgroud)
但是如何表达X and Y的类型提示呢?当表达相关对象必须是 和 的子类时,这将很有X用Y。
只要所有继承这两者X并Y事先已知的类,以下示例就可以工作:
class X: pass
class Y: pass
class A(X,Y): pass
class B(X,Y): pass
def some_function(arg: Union[A,B]):
pass
# do stuff with arg that only depends on inherited members from X and Y
Run Code Online (Sandbox Code Playgroud)
但是如果另一个依赖于上面代码的包定义了:
class C(X,Y): pass
Run Code Online (Sandbox Code Playgroud)
Csome_function也将按设计工作。我正在寻找更好的类型提示来使用,而不是Union[X,Y]包含任何可能的子类X和Y。
我理解解决方法可能是定义:
class XY(X,Y): pass
Run Code Online (Sandbox Code Playgroud)
然后将其用作基类和类型提示:
class A(XY): pass
class B(XY): …Run Code Online (Sandbox Code Playgroud) 在我的Python脚本的一种数据结构我分析的是一个JSON文件,该文件后json.load(file_handle),是类型<class 'dict'>。到现在为止还挺好。现在对于使用它作为输入参数的函数,我想要解析的 json 的类型提示。我在打字文档中读到,对于dicts 作为参数,我应该使用Mapping[key_type, value_type]:
from typing import Mapping
def foo(json_data: Mapping[str, str]) -> None:
...
Run Code Online (Sandbox Code Playgroud)
我解析的 json 有str-type 键和str-type 值,但通常情况下,它的结构是高度递归的。因此,值更可能是dict带有str键的 a,甚至是dicts 作为值。它是非常嵌套的,直到在最深的层次上,最后一个 dict 终于有了str键和str值。
那么我如何更精确地表示这个数据结构呢?我在想一些事情,沿着这个问题的思路,它可能是:
Union[Mapping[str, str], Mapping[str, Mapping]]
Run Code Online (Sandbox Code Playgroud)
但它似乎只代表一级递归。有没有更好的方法来提示这个?
如何输入可选输出参数提示:
def myfunc(
x: float,
return_y: bool = False
) -> float, Optional[float] : # !!! WRONG !!!
# ... code here
#
# y and z are floats
if return_y:
return z, y
return z
Run Code Online (Sandbox Code Playgroud)
- - 编辑
-> Tuple[float, Union[None, float]] :
Run Code Online (Sandbox Code Playgroud)
但这太丑陋了,似乎掩盖了一个事实,即通常它只会返回一个简单的浮点数。这是正确的方法吗?
正确的方法请参阅下面的答案。
---编辑2
此问题被标记为该问题的重复项。然而,那个问题是关于Union返回类型的,而这个问题是关于Optional返回类型的。
注意:这种设计不是一个好的实践,应该避免,以支持一致的返回类型。尽管如此,如果必须这样做,可选输出参数意味着根据输入参数的标志可能不会返回的参数。
from dataclasses import dataclass
@dataclass
class InventoryItem:
"""Class for keeping track of an item in inventory."""
name: str | None = None
unit_price: float
quantity_on_hand: int = 0
Run Code Online (Sandbox Code Playgroud)
类型错误: | 不支持的操作数类型:“type”和“NoneType”
Python 3.9
我认为问题是使用最新版本的python,如何解决。
我尝试使用“或”,但没有帮助
python ×10
type-hinting ×6
python-3.x ×4
python-3.5 ×3
arguments ×1
dictionary ×1
docstring ×1
json ×1
nonetype ×1
return-type ×1
typing ×1
version ×1