如何使用带有参数的python装饰器?

问题描述 投票:1回答:1

我想定义一个装饰器,该装饰器将通过作为装饰器自变量给出的名称来注册类。我可以从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)

此代码将生成一个空字典,而我希望有两个条目的字典。您对我的代码有什么问题有任何想法吗?

python-3.x python-decorators
1个回答
0
投票

我认为这是一个范围问题。尝试使用global

    @functools.wraps(kls)
    def wrapper_register(*args, **kwargs):

        global READERS 

        READERS[typ] = kls 
    return wrapper_register
© www.soinside.com 2019 - 2024. All rights reserved.