pint:用 ureg.wraps() 包装 built-in 函数是不可能的吗?
pint: Is wrapping built-in functions with ureg.wraps() impossible?
我正在尝试 wrap time.sleep:
from time import sleep
from pint import UnitRegistry
ureg = UnitRegistry()
ureg.wraps(None, ureg.seconds)(sleep)
但是,此代码抛出一个 ValueError:
Traceback (most recent call last):
File "demo.py", line 5, in <module>
ureg.wraps(None, ureg.seconds)(sleep)
File "[path-to-venv]/lib/python3.8/site-packages/pint/registry_helpers.py", line 258, in decorator
count_params = len(signature(func).parameters)
File "/usr/lib/python3.8/inspect.py", line 3105, in signature
return Signature.from_callable(obj, follow_wrapped=follow_wrapped)
File "/usr/lib/python3.8/inspect.py", line 2854, in from_callable
return _signature_from_callable(obj, sigcls=cls,
File "/usr/lib/python3.8/inspect.py", line 2308, in _signature_from_callable
return _signature_from_builtin(sigcls, obj,
File "/usr/lib/python3.8/inspect.py", line 2119, in _signature_from_builtin
raise ValueError("no signature found for builtin {!r}".format(func))
ValueError: no signature found for builtin <built-in function sleep>
是否无法包装内置函数?有解决方法吗?
有一个解决方法:定义您自己的(非内置)函数。这可以是这样一个简单的 lambda:
ureg.wraps(None, ureg.seconds)(lambda t: sleep(t))
我正在尝试 wrap time.sleep:
from time import sleep
from pint import UnitRegistry
ureg = UnitRegistry()
ureg.wraps(None, ureg.seconds)(sleep)
但是,此代码抛出一个 ValueError:
Traceback (most recent call last):
File "demo.py", line 5, in <module>
ureg.wraps(None, ureg.seconds)(sleep)
File "[path-to-venv]/lib/python3.8/site-packages/pint/registry_helpers.py", line 258, in decorator
count_params = len(signature(func).parameters)
File "/usr/lib/python3.8/inspect.py", line 3105, in signature
return Signature.from_callable(obj, follow_wrapped=follow_wrapped)
File "/usr/lib/python3.8/inspect.py", line 2854, in from_callable
return _signature_from_callable(obj, sigcls=cls,
File "/usr/lib/python3.8/inspect.py", line 2308, in _signature_from_callable
return _signature_from_builtin(sigcls, obj,
File "/usr/lib/python3.8/inspect.py", line 2119, in _signature_from_builtin
raise ValueError("no signature found for builtin {!r}".format(func))
ValueError: no signature found for builtin <built-in function sleep>
是否无法包装内置函数?有解决方法吗?
有一个解决方法:定义您自己的(非内置)函数。这可以是这样一个简单的 lambda:
ureg.wraps(None, ureg.seconds)(lambda t: sleep(t))