装饰器修改发电机值

时间:2019-11-19 13:48:00

标签: python python-3.x

我有一个类,该类的每个方法都产生一个字典。我想创建一个装饰器,该装饰器将当前日期和时间添加到字典中,这是从一种方法产生的。我已经实现了基于函数的解决方案,所以它看起来像这样:

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)

非常感谢您检查这篇文章以及所有建议。

2 个答案:

答案 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'}