【发布时间】:2023-01-28 23:15:43
【问题描述】:
我正在尝试创建一个代表要为我的应用程序执行的正则表达式的类。对于每个正则表达式,我都有一个指向 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 作为类而不是 Func 获取。我怎样才能得到这个?
P.S.:您是否有另一种方法可以避免将正则表达式模式之类的应用程序逻辑与我仅用于文档的 url 混合使用?
【问题讨论】:
标签: python design-patterns python-decorators