python 用参数修饰类声明

pdkcd3nj  于 2023-01-29  发布在  Python
关注(0)|答案(1)|浏览(120)

我正在尝试创建一个类来表示一个正则表达式,以便为我的应用程序执行。对于每个正则表达式,我都有一个到regex101.com页面的链接,用户可以在那里找到单元测试。我想使用这个解决方案,在类声明附近有这个链接,但不在类代码中有它们。我考虑的代码必须看起来像这样:

class TestUrl(object):
    def __init__(self, url) -> None:
        self.url = url
        
    def __call__(self, cls) -> Any:
        functools.update_wrapper(self, cls)
        cls.url = self.url

        def wrapper(*args: Any, **kwds: Any):
            return cls(*args, **kwds)
        
        return wrapper

def test_url(url):
    def wrapper_class(cls):
        cls.test_url = url

        @functools.wraps(cls)
        def wrapper(*args, **kwargs):
            return cls(*args, **kwargs)

        return wrapper

    return wrapper_class

class Regex:
    def __init__(self, pattern, repl, flags) -> None:
        self.exp = re.compile(pattern, flags=flags)
        self.repl = repl
        self.flags = flags

    def sub(self, string: str):
        return self.exp.sub(self.repl, string)

@test_url("https://regex101.com/r/.../...")
class SubRegex(Regex):
    def __init__(self):
        super().__init__(r'...', r'...', re.MULTILINE | re.DOTALL)

但我的问题是,当我想在模块中的所有类上使用以下代码循环时:

def test_all_regexs(regex):
    module = importlib.import_module("...")
    print(f"Looking at {module}")
    for name, obj in inspect.getmembers(module):
        if inspect.isclass(obj):
            print(f"Class: {name}, {obj}")
        if inspect.isfunction(obj):
            print(f"Func: {name}, {obj}")

输出始终为:

Func: SubRegex, <function SubRegex at ...>
Class: Regex, <class '....Regex'>
Class: TestUrl, <class '....TestUrl'>
Func: test_url, <function test_url at ...>

我不知道如何得到SubRegex作为类,而不是作为函数。我怎么才能得到这个?
P.S.:你有没有其他方法可以避免把应用程序逻辑(比如regex模式)和我只用于文档的url混合在一起?

gg0vcinb

gg0vcinb1#

你的装饰器不应该定义一个新的函数(或者一个新的类)来返回(或者一个新的类),它应该简单地就地更新cls,然后返回cls本身。

def test_url(url):
    def wrapper(cls):
        cls.test_url = url
        return cls 
    return wrapper

相关问题