【发布时间】:2019-02-22 19:03:36
【问题描述】:
假设我们有多个函数,它们都接受一个 URL 作为它们的第一个参数,并且这个 URL 需要被验证。这可以通过装饰器很好地解决
def validate_url(f):
def validated(url, *args, **kwargs):
assert len(url.split('.')) == 3 # trivial example
return f(url, *args, **kwargs)
return validated
@validate_url
def some_func(url, some_other_arg, *some_args, **some_kwargs):
pass
这种方法可行,并允许我从许多类似函数的实例中考虑验证行为。但是现在我想写一个类方法,它也需要一个经过验证的 URL。但是,幼稚的方法是行不通的
class SomeClass:
@validate_url
def some_method(self, url, some_other_args):
pass
因为我们最终会尝试验证 self 而不是 url。我的问题是如何编写一个单一的装饰器,它适用于具有最少样板量的函数和方法。
注意 1:我知道为什么会发生这种情况,只是我不知道如何以最优雅的方式解决这个问题。
注意2:URL验证问题只是一个例子,所以检查isinstance(args[0], str)是否不是一个好的解决方案。
【问题讨论】:
-
不确定this是否可以在这里申请
-
你能定义一个像
def validate_url(url, *args)这样在some_func内部运行的@staticmethod吗?然后你可以装饰validate_url。看起来 hacky 和非 Pythonic,但这是我尝试的第一件事
标签: python