Skip to content Skip to sidebar Skip to footer

Built-in Variable To Get Current Function

I have a lot of functions like the following, which recursively call themselves to get one or many returns depending on the type of the argument: def get_data_sensor(self, sensorna

Solution 1:

You can abstract that logic outside the function entirely by using a decorator (see this thorough answer if you're unfamiliar with decorators):

from functools import wraps

defautolist(func):
    @wraps(func)defwrapper(args):
        ifisinstance(args, list):
            return [func(arg) for arg in args]
        return func(args)
    return wrapper

This decorator can be applied to any function requiring the pattern, which now only needs to implement the scalar case:

>>>@autolist...defsquare(x):...return x ** 2...>>>square(1)
1
>>>square([1, 2, 3])
[1, 4, 9]

If you're applying it to a method, as self implies, you'll also need to take that argument into account in the wrapper. For example, if the relevant argument is always the last one you could do:

defautolist(func):
    @wraps(func)defwrapper(*args):
        *args, last_arg = args
        ifisinstance(last_arg, list):
            return [func(*args, arg) for arg in last_arg]
        return func(*args, last_arg)
    return wrapper

This would work on methods, too:

>>>classSquarer:...    @autolist...defsquare(self, x):...return x ** 2...>>>Squarer().square(1)
1
>>>Squarer().square([1, 2, 3])
[1, 4, 9]

Post a Comment for "Built-in Variable To Get Current Function"