jun*_*ang 8 python type-hinting python-3.x python-decorators
为了包装模块的所有函数调用并通过包装器类的__getattr__
方法访问它,我尝试使用typing
库,但我无法弄清楚如何正确执行此操作。
import interface
"""
>>> print(interface.__all__)
['execute_foo_operation', ...]
"""
class InterfaceWrapper(object):
def __init__(self, job_queue):
self.job_queue = job_queue
self.callbacks = []
def __getattr__(self, name):
func = getattr(interface, name)
return functools.partial(self._wrapper, func)
def _wrapper(self, func, *args, **kwargs):
job = func(*args, **kwargs)
self.job_queue.push(job)
for callback in self.callbacks:
callback(job)
return job
def register_callback(self, callback):
self.callbacks.append(callback)
class Operator(object):
def __init__(self, job_queue):
self.interface = InterfaceWrapper(job_queue)
def after_queuing(self):
# do something
def execute_foo_operation(self):
self.interface.register_callback(self.after_queuing)
self.interface.execute_foo_operation() # unresolved attribute
Run Code Online (Sandbox Code Playgroud)
任何人都可以指导我的代码正常工作吗?
通常,__getattr__
可以返回任何内容。所以你可以使用 Typing.Any
From Typing import Any
def __getattr__(self, name: str) -> Any:
...
Run Code Online (Sandbox Code Playgroud)
但看起来你的实现__getattr__
是返回一个可调用的
From Typing import Callable
def __getattr__(self, name: str) -> Callable:
...
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
824 次 |
最近记录: |