如何防止编写相同的代码?无法正确编写装饰器。蟒蛇

时间:2018-06-08 07:42:09

标签: python-3.x flask

这是我的代码,工作正常。我在Flask中使用unittest。我不想在每种方法中反复重复相同的代码。

def setUp(self):
    self.ctx = app.app_context()

def test_check_data_cleanup_functionality(self):
    with self.ctx:
        g.db_client = main_client["some_text"]
        test_json["stray"] = "abc"
        view = View.objects.get(name="test_document")
        all_fields = get_all_fields(DocumentDefinition.objects.get(name="test_document"))
        status = sanity_check(test_json, view, all_fields, old_collection=None, parent_field_id="")
        self.assertFalse(status[0]["error"])

但是,对于每种方法,我都不想输入相同的代码,

 with self.ctx:
        g.db_client = main_client["some_text"]

我该如何解决?我尝试创建装饰器但由于某种原因我无法获得正确的语法或逻辑。我尝试了各种教程,但我无法这样做。帮忙。我的装饰代码如下。

def timing_function(some_function):
        def wrapper(some_function_):
            with app.app_context():
                g.db_client = main_client["some_text"]
                some_function()
        return wrapper  


@timing_function
 def test_check_unique(self):
        test_json["single_line_field"] = "Hello!"
        view = View.objects.get(name="test_document")
        all_fields = get_all_fields(DocumentDefinition.objects.get(name="test_document"))
        status = sanity_check(test_json, view, all_fields, old_collection=None, parent_field_id="")
        self.assertTrue(status[0]["error"])

1 个答案:

答案 0 :(得分:1)

这适用于简单的装饰者:

def timing_function(func):
    def wrapper(*args, **kwargs):
        with app.app_context():
            g.db_client = main_client["ondotfreight"]
            func(*args, **kwargs)
    return wrapper

装饰器接受func并返回应该替换它的任何东西。为了使其尽可能通用,内部(替换)函数采用*args**kwargs,但这可以是专门的。

它使用像gapp这样的全局变量,这使得装饰器非常依赖于它内部使用的环境,但如果没有装饰器的代码有效,那么这应该是,太

假设您想要向装饰器添加参数,例如传递进入main_client的键,它将如下所示:

def timing_function(main_client_name)
    def wrapper_gen(func):
        def wrapper(*args, **kwargs):
            with app.app_context():
                g.db_client = main_client[main_client_name]
                func(*args, **kwargs)
        return wrapper
    return wrapper_gen

这里首先从参数创建一个装饰器,然后将此装饰器应用于该函数,就像在没有参数的正常情况下一样。有了这个,你可以这样做:

@timing_function("ondotfreight")
def test_check_unique(self):
    # ...