Catanzaro
Catanzaro

Reputation: 1380

How create decorator inside a class?

I want create a simple decorator function that get in input a func e add some methode before. Here an example:

class A:

    def beforeWriteOracle(func):
        def wrapper(self, func):
            self.dbOracle.truncateTable(self.oracle_final_table)
            func(self.mylist)
        return wrapper

    @beforeWriteOracle
    def writeDataToOracle(self, writeDataToOracleRequestList): 
        return self.executeMethod(self.writeDataToOracleImpl, writeDataToOracleRequestList, threaded, False)

    self.writeDataToOracle(self, writeDataList)

but i have error:

"beforeWriteOracle() missing 1 required positional argument: 'func'"

How use correctly decorator for my case?

thanks

Upvotes: 1

Views: 52

Answers (1)

chepner
chepner

Reputation: 530950

You don't need to (or want to) pass func as an argument to the wrapper; the wrapper should take the same arguments that function you are decorating takes, since it's going to "become" that function.

func itself is available as a non-local variable inside wrapper, which is a closure: it retains the value passed to beforeWriteOracle even after beforeWriteOracle exits.

def beforeWriteOracle(func):
    def wrapper(self, *args, **kwargs):
        self.dbOracle.truncateTable(self.oracle_final_table)
        func(self, *args, **kwargs)
    return wrapper


@beforeWriteOracle
def writeDataToOracle(self, writeDataToOracleRequestList):
    return self.executeMethod(self.writeDataToOracleImpl, writeDataToOracleRequestList, threaded, False)

Upvotes: 1

Related Questions