你可以在display_text
中输入hint text
参数与String
,但如果提供的参数将是str
,调用convert
并将返回值赋给文本,而不需要在display_text
函数中添加任何额外的代码,只需要输入hinting.
不,不是类型提示的just,因为类型注释在运行时是绝对惰性的,什么都不做(from __future__ import annotations
,它们甚至不被判断).如果这是一个技巧性的问题,并且"in a display_text
函数"是关键,那么是的,你可以@修饰你的函数(或者修饰一个包含它们的类,或者使用元类)来包装函数,如果需要的话,使用类型注释来强制转换参数.
一个这样的decorator 的例子:
import dataclasses
import inspect
from functools import wraps
from typing import Any
def convert_args(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
sig = inspect.signature(fn)
bound_args = sig.bind(*args, **kwargs)
bound_args.apply_defaults()
for name, val in bound_args.arguments.items():
param = sig.parameters[name]
if hasattr(param.annotation, "convert"):
bound_args.arguments[name] = param.annotation.convert(val)
return fn(*bound_args.args, **bound_args.kwargs)
return wrapper
@dataclasses.dataclass
class Shouty:
val: str
@classmethod
def convert(cls, val: Any):
return Shouty(val=str(val).upper())
@dataclasses.dataclass
class Shorten:
val: str
@classmethod
def convert(cls, val: Any):
return Shorten(val=str(val)[::2])
@convert_args
def display_text(arg1: Shouty, arg2: Shorten):
print(locals())
display_text("hello", "world, this is an example")
这是打印出来的
{'arg1': Shouty(val='HELLO'), 'arg2': Shorten(val='wrd hsi neape')}