Встроенный метод 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
значение функции используется.