Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 11, 2010 09:01:28

BelStudent
От:
Зарегистрирован: 2010-06-09
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Определение функции. Аргументы. Словарь или переменные?

Такой интересный вопрос: если функция содержит много аргументов, то её заголовок сильно разрастается. Можно уменьшить если все переменные засунуть в словарь, но тогда определение функции нам ничего не говорит, и если возвратиться к коду через некоторое время, то не будешь знать что передавать, и придется выискивать переменные по телу функции.
Вот такая дилемма.
Как быть?



Офлайн

#2 Авг. 11, 2010 09:12:43

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Определение функции. Аргументы. Словарь или переменные?

документировать свою функцию :)



Офлайн

#3 Авг. 11, 2010 09:19:14

Alex2ndr
От:
Зарегистрирован: 2009-12-26
Сообщения: 204
Репутация: +  0  -
Профиль   Отправить e-mail  

Определение функции. Аргументы. Словарь или переменные?

Мне кажется что тут стоит руководствоваться Zen of Python - Explicit is better than implicit (Явное лучше неявного) - и соответственно указывать все параметры в заголовке.
Мне, обычно, на размер заголовок плевать, т к за заголовком идет docstring в котором все эти параметры перечисляются и описываются. А он получается раз в 10 больше самого большого заголовка.



Офлайн

#4 Авг. 11, 2010 09:28:28

BelStudent
От:
Зарегистрирован: 2010-06-09
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Определение функции. Аргументы. Словарь или переменные?

Alex2ndr
Мне кажется что тут стоит руководствоваться Zen of Python - Explicit is better than implicit (Явное лучше неявного) - и соответственно указывать все параметры в заголовке.
Мне, обычно, на размер заголовок плевать, т к за заголовком идет docstring в котором все эти параметры перечисляются и описываются. А он получается раз в 10 больше самого большого заголовка.
Разрастается не только определение, но и вызов функции. И вложенный вызов функций уже трудно делать (трудно разобрать) приходиться одну функцию писать в одну строку и сохранять какой-то переменной.



Офлайн

#5 Авг. 11, 2010 09:34:53

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Определение функции. Аргументы. Словарь или переменные?

У Фаулера большое количество аргументов в функции - дурной запах. Значит, нужен рефакторинг.
Посмотрите внимательно - наверное, вам стоит сделать новый класс.



Офлайн

#6 Авг. 12, 2010 09:35:31

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Определение функции. Аргументы. Словарь или переменные?

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
>>>



Офлайн

#7 Авг. 27, 2010 20:21:57

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Определение функции. Аргументы. Словарь или переменные?

Если все-таки исходить из того, что аргументы должны остаться (такое хоть и редко, но бывает), то можно сделать именованные аргументы со значениями по умолчанию:

 
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, то гарантию не даю.



Отредактировано (Авг. 27, 2010 20:31:41)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version