关注http://www.artima.com/weblogs/viewpost.jsp?thread=240845,我写了装饰师extend_to_separated_input
:
class extend_to_separated_input(object):
def __init__(self, separator):
assert isinstance(separator, str), "The separator must be a string."
self.separator = separator
def __call__(self, parse_function):
def wrapped_function(raw_conditions, *args, **kwargs):
raw_conditions = raw_conditions.split(self.separator)
return [parse_function(raw_condition, *args, **kwargs) for raw_condition in raw_conditions]
return wrapped_function
此装饰器适用于全局定义的函数,例如
import parse
fmt = "{word1} {word2}"
@extend_to_separated_input(separator="&&")
def _parse(string):
return parse.parse(fmt, string).named
string = "foo bar && hello world"
print _parse(string)
打印结果
[{'word1': 'foo', 'word2': 'bar '}, {'word1': ' hello', 'word2': 'world'}]
这是我所期待的。 (这里我使用了parse模块)。但是,在我的实际用例中,_parse
方法是一个类方法,而不是一个全局方法。但是,如果我尝试这样做:
class TwoWords(object):
fmt = "{word1} {word2}"
@classmethod
@extend_to_separated_input(separator="&&")
def _parse(cls, raw_condition):
return parse.parse(cls.fmt, raw_condition).named
string = "foo bar && hello world"
print TwoWords._parse(string)
我得到了
AttributeError: type object 'TwoWords' has no attribute 'split'
问题是它正在把这个类作为第一个参数。我已尝试将定义调整为def wrapped_function(cls, raw_conditions, *args, **kwargs)
,但由于参数不足,这会导致TypeError
。
我如何调整装饰器以使其适用于类方法?