LINUX.ORG.RU

Python 2, проверка подстановки аргументов в функцию

 


0

0

Допустим, есть функция: def function1(a, b=«hello»). Мы можем её вызывать function1(1, «world») или function1(2), или function1(3, «hello»).

Как узнать, b == «hello» из-за подстановки аргумента при вызове или дефолтного значения? Есть такой атрибут function1.__defaults__ - это тупл с дефолтными значениями аргументов. Для function1 он будет равен («hello»,). Но когда мы вызываем function1(3, «hello») у нас всегда будет b in function1.__defaults__ == True тупо потому что строки одинаковые.

Я не нашёл решения в инете. Может, кто-то знает про такое?

З.Ы. Про подстановку типа def function1(a, b=None) и про всякие *args, **kwargs я знаю, использовать это здесь нельзя по заданию.

★★★★★

А какая разница, было оно подстановлено или нет? Для чего ты хочешь получить эту информацию?

vurdalak ★★★★★
()

Декорируй её, в декораторе проверяй, дефолтная она или нет и передавай эту информацию как угодно внутрь функции.

x3al ★★★★★
()

Разобрался. Проверяю так:

if b is function1.__defaults__[0]:

sT331h0rs3 ★★★★★
() автор топика

Не надо никаких декораторов и прочего переусложнения на ровном месте:

def function1(a, b=None):
  if b == None:
    b = "hello"
    ...

И вообще вся суть аргументов по-умолчанию это то что ты не заморачиваешься тем переданы они или нет. Я подозреваю что ты что-то делаешь неправильно. Что за задача-то стоит?

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Наверно по заданию надо в стек залезть.

ei-grad ★★★★★
()

__defaults__

Забавно, не знал. Что только не придумают.

Virtuos86 ★★★★★
()
Ответ на: комментарий от true_admin

вообще вся суть аргументов по-умолчанию это то что ты не заморачиваешься тем переданы они или нет

Ты не прав. Может иметь значение задан аргумент явно, или нет. Функция может при этом выполнять разные действия, т.е. это как перегрузка функции, только явно (вручную).

no-such-file ★★★★★
()
Ответ на: комментарий от true_admin

Например, функция чтения из файла, которая принимает имя файла как аргумент, а если аргумент не задан, то открывает stdin. Можно использовать None по умолчанию? Вроде бы можно, но эта функция работает в паре с другой, которая парсит конфиг, чтобы получить имя файла для первой функции, и если в конфиге такого параметра нет, то возвращает None. Первая функция при явной передаче None должна выдать предупреждение в лог, что передан пустой параметр. Как быть?

Можно использовать по умолчанию не None, а что-то другое, но это костыль. Можно контролировать отсутствие параметра во второй функции, перед передачей в первую, но это тоже костыль, т.к. первая функция может использоваться не с одной функцией которая парсит лог - их может быть несколько в разных частях программы, и в проверку придётся добавлять в каждую из них.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

функция чтения из файла, которая принимает имя файла как аргумент, а если аргумент не задан, то открывает stdin

Не вижу проблем:

def func(file=sys.stdin):
  ..

Собстно, print в py3k так и работает.

если в конфиге такого параметра нет, то возвращает None

Ммм, обычно конфиг возвращается в чём-то типо словаря и там можно сделать cfg.get(«file», default=sys.stdin)

Можно использовать по умолчанию не None, а что-то другое, но это костыль.

Это нормальная распространённая практика. Делается, например, так:

default = object()   # или class default: pass
def func(file=default):
 ...

Мне кажется, я решил все твои проблемы без использования непереносимых (!) костылей типа __defaults__ стандартными общепринятыми способами. Т.е. придумать пример когда это внезапно понадобится можно, конечно, но в реальности таких ситуаций у меня не возникало.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.