Найти - Пользователи
Полная версия: Определение функции. Аргументы. Словарь или переменные?
Начало » Python для экспертов » Определение функции. Аргументы. Словарь или переменные?
1
BelStudent
Такой интересный вопрос: если функция содержит много аргументов, то её заголовок сильно разрастается. Можно уменьшить если все переменные засунуть в словарь, но тогда определение функции нам ничего не говорит, и если возвратиться к коду через некоторое время, то не будешь знать что передавать, и придется выискивать переменные по телу функции.
Вот такая дилемма.
Как быть?
sp3
документировать свою функцию :)
Alex2ndr
Мне кажется что тут стоит руководствоваться Zen of Python - Explicit is better than implicit (Явное лучше неявного) - и соответственно указывать все параметры в заголовке.
Мне, обычно, на размер заголовок плевать, т к за заголовком идет docstring в котором все эти параметры перечисляются и описываются. А он получается раз в 10 больше самого большого заголовка.
BelStudent
Alex2ndr
Мне кажется что тут стоит руководствоваться Zen of Python - Explicit is better than implicit (Явное лучше неявного) - и соответственно указывать все параметры в заголовке.
Мне, обычно, на размер заголовок плевать, т к за заголовком идет docstring в котором все эти параметры перечисляются и описываются. А он получается раз в 10 больше самого большого заголовка.
Разрастается не только определение, но и вызов функции. И вложенный вызов функций уже трудно делать (трудно разобрать) приходиться одну функцию писать в одну строку и сохранять какой-то переменной.
Андрей Светлов
У Фаулера большое количество аргументов в функции - дурной запах. Значит, нужен рефакторинг.
Посмотрите внимательно - наверное, вам стоит сделать новый класс.
py.user.next
BelStudent
не будешь знать что передавать, и придется выискивать переменные по телу функции

приходиться одну функцию писать в одну строку
>>> def f(
... a, # a - is a
... b, # b - is b
... c, # c - is c
... # is c
... # is c
... d # d - is d
... ):
... print(a, b, c, d)
...
>>> f(1, 2, 3, 4)
1 2 3 4
>>> f(
... 1,
... 2,
... 3,
... 4
... )
1 2 3 4
>>>
Isem
Если все-таки исходить из того, что аргументы должны остаться (такое хоть и редко, но бывает), то можно сделать именованные аргументы со значениями по умолчанию:

 
def f( *, a, b, c= None, d = 0, e ):
""" подробно описываем что к чему """
print( a,b,c,d,e)
Ну а вызов функции теперь будет понятным:


 
# 1 вариант вызова
f(a = '_a_', b='_b_', e='_e_')

# 2 вариант вызова с помощью словаря
dic = {'a' : '_a_', 'b' : '_b_', 'e' : '_e_', 'c' : '_c_' }
f( **dic )
Не заданные аргументы примут свои дефолтовые значения. Не указывать названия аргументов при вызове функции нельзя (будет ошибка) и порядок аргументов тоже не важен.
Хочу подчеркнуть, что это работает в питоне 3. Что касается питона 2.x, то гарантию не даю.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB