Определить метод с неизвестным числом аргументов, не равным None - PullRequest
0 голосов
/ 21 февраля 2019

Я работаю в Python 3.7.

Предположим, у меня есть эти две функции, и я не могу изменить их код (т.е. установить аргументы по умолчанию, такие как x=None).

def f1(x):
    return x

def f2(x,y):
    return x+y

Предположим, у меня есть такой класс.

class test():
    def __init__(self, var1, var2 = None, func):
        self.var1 = var1
        self.var2 = var2
        self.func = func

    def apply_func(self):
        return self.func(self.var1, self.var2)

Как структурировать определение класса test так, чтобы self.var2 передавалось только тогда, когда var2 is not None?Так, что я не получаю ошибку аргумента (слишком много аргументов), если я создаю экземпляр с атрибутом fun1 и вызываю метод apply_func?Более того, я не хочу создавать два разных класса для каждого типа функции и только метод функции apply_func.

1 Ответ

0 голосов
/ 21 февраля 2019

Вы можете нарезать список аргументов в соответствии с атрибутом __code__.argcount объекта функции, в котором хранится число аргументов, ожидаемых функцией:

def f1(x):
    return x

def f2(x,y):
    return x+y

class test():
    def __init__(self, func, var1, var2 = None):
        self.var1 = var1
        self.var2 = var2
        self.func = func

    def apply_func(self):
        return self.func(*(self.var1, self.var2)[:self.func.__code__.co_argcount])

, так что:

print(test(f1, 1).apply_func())
print(test(f2, 1, 2).apply_func())

выходы:

1
3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...