我有一个类,该类的每个方法都产生一个字典。我想创建一个装饰器,该装饰器将当前日期和时间添加到字典中,这是从一种方法产生的。我已经实现了基于函数的解决方案,所以它看起来像这样:
from pprint import pprint
from datetime import datetime
def _concat_datetime(func):
def wrapper():
for document in func():
yield {
**document,
"current_date": datetime.now().strftime("%Y-%m-%d"),
"current_time": datetime.now().strftime("%H:%M:%S"),
}
yield from wrapper()
@_concat_datetime
def test():
yield {
"a": "a",
"b": "b",
"c": "c"
}
for doc in test:
pprint(doc)
输出:
{
'a': 'a',
'b': 'b',
'c': 'c',
'current_date': '2019-11-19',
'current_time': '15:35:31'
}
但是,使用基于类的解决方案,我遇到了冲突,并与self
关键字相关联。我发现,我需要将self
传递给wrapper()
。但是我不知道从哪里得到。
基于类的解决方案:
class TestClass:
def _concat_datetime(func):
def wrapper(self):
for document in func(self):
yield {
**document,
"current_date": datetime.now().strftime("%Y-%m-%d"),
"current_time": datetime.now().strftime("%H:%M:%S"),
}
yield from wrapper()
@_concat_datetime
def test(self):
yield {
"a": "a",
"b": "b",
"c": "c"
}
obj = TestClass()
for doc in obj.test:
pprint(doc)
非常感谢您检查这篇文章以及所有建议。
答案 0 :(得分:1)
只返回生成器函数,而不是从生成器屈服。
class TestClass:
def _concat_datetime(func):
def wrapper(self):
for document in func(self):
yield {
**document,
"current_date": datetime.now().strftime("%Y-%m-%d"),
"current_time": datetime.now().strftime("%H:%M:%S"),
}
return wrapper
@_concat_datetime
def test(self):
yield {
"a": "a",
"b": "b",
"c": "c"
}
答案 1 :(得分:1)
我不确定是否正确理解所有内容,但是我觉得您只需要返回修饰的方法而不是返回生成器。在同一情况下,您可以使用产生多个词典的测试函数:
from pprint import pprint
from datetime import datetime
class TestClass:
def _concat_datetime(func):
def wrapper(self):
for document in func(self):
yield {
**document,
"current_date": datetime.now().strftime("%Y-%m-%d"),
"current_time": datetime.now().strftime("%H:%M:%S"),
}
return wrapper
@_concat_datetime
def test(self):
yield dict(enumerate(["a", "b", "c"]))
yield dict(enumerate(["d", "e", "f"]))
obj = TestClass()
for doc in obj.test():
pprint(doc)
哪些印刷品
{0: 'a',
1: 'b',
2: 'c',
'current_date': '2019-11-19',
'current_time': '15:01:07'}
{0: 'd',
1: 'e',
2: 'f',
'current_date': '2019-11-19',
'current_time': '15:01:07'}