我想定义一个装饰器,该装饰器将通过作为装饰器自变量给出的名称来注册类。我可以从stackoverflow和其他来源阅读许多示例,这些示例演示了如何派生此类(棘手的)代码,但是当适应我的需求时,我的代码无法产生预期的结果。这是代码:
import functools
READERS = {}
def register(typ):
def decorator_register(kls):
@functools.wraps(kls)
def wrapper_register(*args, **kwargs):
READERS[typ] = kls
return wrapper_register
return decorator_register
@register(".pdb")
class PDBReader:
pass
@register(".gro")
class GromacsReader:
pass
print(READERS)
此代码将生成一个空字典,而我希望有两个条目的字典。您对我的代码有什么问题有任何想法吗?
我认为这是一个范围问题。尝试使用global
@functools.wraps(kls)
def wrapper_register(*args, **kwargs):
global READERS
READERS[typ] = kls
return wrapper_register