fra*_*ans 11 types python-3.x mypy
注意:由于这个答案不断获得好评 - 虽然仍然有 的用例TypedDict,但我今天会考虑使用 adataclass代替。
class BackupData(TypedDict, total=False):
archive_name: str
archive_size: int
transfer_size: int
transfer_time: float
error: str
def to_backup_data(data: Mapping[str, Any]) -> BackupData:
result = BackupData()
if 'archive_name' in data:
result['archive_name'] = str(data['archive_name'])
if 'archive_size' in data:
result['archive_size'] = int(data['archive_size'])
if 'transfer_size' in data:
result['transfer_size'] = int(data['transfer_size'])
if 'transfer_time' in data:
result['transfer_time'] = int(data['transfer_time'])
if 'error' in data:
result['error'] = str(data['error'])
return result
Run Code Online (Sandbox Code Playgroud)
即我有一个TypedDict带有可选键的并且想要一个TypedDict实例。
上面的代码是多余的和非功能性的(就函数式编程而言),因为我必须编写名称四次,键入两次并且result必须是可变的。遗憾的TypedDict是没有方法,否则我可以写一些东西。喜欢
backup_data = BackupData.from(json.loads({...}))
Run Code Online (Sandbox Code Playgroud)
我有什么遗漏的吗TypeDict?可以用一种漂亮的、非冗余的方式来写吗?
当您使用 TypedDict 时,所有信息都存储在该__annotations__字段中。
对于你的例子:
BackupData.__annotations__
Run Code Online (Sandbox Code Playgroud)
返回:
{'archive_name': <class 'str'>, 'archive_size': <class 'int'>, 'transfer_size': <class 'int'>, 'transfer_time': <class 'float'>, 'error': <class 'str'>}
Run Code Online (Sandbox Code Playgroud)
现在我们可以使用该字典来迭代数据并使用值进行类型转换:
def to_backup_data(data: Mapping[str, Any]) -> BackupData:
result = BackupData()
for key, key_type in BackupData.__annotations__.items():
if key not in data:
raise ValueError(f"Key: {key} is not available in data.")
result[key] = key_type(data[key])
return result
Run Code Online (Sandbox Code Playgroud)
请注意,当数据不可用时,我会抛出错误,您可以自行决定更改此错误。
使用以下测试代码:
data = dict(
archive_name="my archive",
archive_size="50",
transfer_size="100",
transfer_time="2.3",
error=None,
)
for key, value in result.items():
print(f"Key: {key.ljust(15)}, type: {str(type(value)).ljust(15)}, value: {value!r}")
Run Code Online (Sandbox Code Playgroud)
结果将是:
Key: archive_name , type: <class 'str'> , value: 'my archive'
Key: archive_size , type: <class 'int'> , value: 50
Key: transfer_size , type: <class 'int'> , value: 100
Key: transfer_time , type: <class 'float'>, value: 2.3
Key: error , type: <class 'str'> , value: 'None'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6039 次 |
| 最近记录: |