Встроенный метод python getattr выполняет аргументы по умолчанию

Я не знаю, является ли это ожидаемым поведением getattr встроенный метод.getattr выполняет аргумент по умолчанию (3-й), даже если фактический аргумент (2-й) удовлетворяет условию. Пример:

def func():
    print('In Function')

class A:
    def __init__(self):
        self.param = 12

a = A()

Когда я бегу getattr(a, 'param', func()) это дает такой результат:

In Function
12

Обратите внимание In Function который я не хочу.

Но он прекрасно работает, когда я выполняю getattr(a, 'param1', func()) т.е. вывод

In Function

Но я хочу только результат как 12 если выполнено условие. Пожалуйста, дайте мне знать, почему getattr имеет такое поведение и можем ли мы помешать им сделать это (то есть не выполнять 3-й аргумент, если имеет 2-й аргумент), будет оценено, если вы поделитесь альтернативным способом сделать это Pythonic. Первое, что приходит в голову, это проверить, param1 существовать, используя hasattr а потом делай необходимое.

1 ответ

Решение

До getattr выполняется, все переданные параметры должны быть оценены. func() является одним из этих параметров, и попытка оценить его будет выполнять print заявление. Будет ли атрибут найден или нет, func() должны быть оценены априори.

Это не свойственно getattrЭто то, как функции и их параметры работают в Python.


Учтите следующее:

>>> def does_nothing(any_arg): pass
...
>>> def f(): print("I'll get printed")
...
>>>
>>> does_nothing(f())
I'll get printed

функция does_nothing на самом деле ничего не делает с переданным параметром. Но параметр должен быть оценен, прежде чем вызов функции может пройти.


print Заявление, однако, не повлияет на результат getattr; своего рода побочный эффект. Если атрибут не найден, return значение функции используется.

Другие вопросы по тегам