Динамически декорировать функцию внутри класса в Python3 - PullRequest
0 голосов
/ 05 октября 2019

Это расширение Создание динамического / динамического метода (генерация кода) в Python

@ Джон Монтгоммери правильно ответил на вопрос @Eli Bendersky о том, что вы можете динамически создать класс сфункция, использующая эту логику:

class Dynamo(object):
    pass

def add_dynamo(cls,i):
    def innerdynamo(self):
        print "in dynamo %d" % i
    innerdynamo.__doc__ = "docstring for dynamo%d" % i
    innerdynamo.__name__ = "dynamo%d" % i
    setattr(cls,innerdynamo.__name__,innerdynamo)

for i in range(2):
    add_dynamo(Dynamo, i)

d=Dynamo()
d.dynamo0()
d.dynamo1()

Мой вопрос таков: как вы декорируете результирующие функции в этом классе декоратором, которому требуется параметр?

Например: определение статической функции:

class MyTaskSequence(TaskSequence):
    @seq_task(1)
    def sequence1(self):
        self.client.get("/devops/")

    @seq_task(2)
    def sequence2(self):
        self.client.get("/blog/")

Что я пробовал:

class MyTaskSequence(TaskSequence):
    pass


def add_sequence(cls, order, path):
    def sequence(self):
        self.client.get(path)
    sequence.__name__ = "sequence%d" % order
    setattr(cls, sequence.__name__, seq_task(order)(sequence))

add_sequence(MyTaskSequence, 1, "/devops/")
add_sequence(MyTaskSequence, 2, "/blog/")

1 Ответ

0 голосов
/ 05 октября 2019

Вы можете напрямую применить декоратор при создании метода:

def add_sequence(cls, order, path):
    @seq_task(order)
    def sequence(self):
        self.client.get(path)
    sequence.__name__ = "sequence%d" % order
    setattr(cls, sequence.__name__, sequence)
...