Вопрос

Я видел этот ТАК вопрос (это не дубликат): Голая звездочка Python в аргументе функции

В python-3.x вы можете добавить голый * к аргументам функции, это означает, что (цитата из документы):

Параметры после «*» или «*идентификатор» являются параметрами только для ключевых слов и могут быть переданы только используемые аргументы ключевых слов.

Итак, я определил функцию:

>>> def f(a, b, *, c=1, d=2, e=3):
...     print('Hello, world!')
... 

я могу пройти c, d и e значения переменных только путем указания ключевых слов:

>>> f(1, 2, 10, 20, 30)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() takes 2 positional arguments but 5 were given
>>> f(1, 2, c=10, d=20, e=30)
Hello, world!

Вопросы:

  • Какова мотивация такого рода ограничений/синтаксического сахара?
  • Какие варианты использования он охватывает?
  • Действительно ли он используется в сторонних библиотеках, перешедших на python3?

Некоторые примеры из «реального мира» очень помогли бы.Заранее спасибо.

Это было полезно?

Решение

ПЭП 3102 довольно четко объясняет причину:дело в том, чтобы позволить функциям принимать различные «опции», которые по сути ортогональны по своей природе.Указание их позиционно неудобно как на определяющей, так и на вызывающей стороне, поскольку у них нет какого-либо очевидного «приоритета», который можно было бы перевести в позиционный порядок.

В различных библиотеках есть множество примеров функций, которые могли бы извлечь из этого пользу.Например, позывной pandas.read_csv является:

def parser_f(filepath_or_buffer,
                 sep=sep,
                 dialect=None,
                 compression=None,

                 doublequote=True,
                 escapechar=None,
                 quotechar='"',
                 quoting=csv.QUOTE_MINIMAL,
                 skipinitialspace=False,
                 lineterminator=None,

                 header='infer',
                 index_col=None,
                 names=None,
                 prefix=None,
                 skiprows=None,
                 skipfooter=None,
                 skip_footer=0,
                 na_values=None,
                 na_fvalues=None,
                 true_values=None,
                 false_values=None,
                 delimiter=None,
                 converters=None,
                 dtype=None,
                 usecols=None,

                 engine='c',
                 delim_whitespace=False,
                 as_recarray=False,
                 na_filter=True,
                 compact_ints=False,
                 use_unsigned=False,
                 low_memory=_c_parser_defaults['low_memory'],
                 buffer_lines=None,
                 warn_bad_lines=True,
                 error_bad_lines=True,

                 keep_default_na=True,
                 thousands=None,
                 comment=None,
                 decimal=b'.',

                 parse_dates=False,
                 keep_date_col=False,
                 dayfirst=False,
                 date_parser=None,

                 memory_map=False,
                 nrows=None,
                 iterator=False,
                 chunksize=None,

                 verbose=False,
                 encoding=None,
                 squeeze=False,
                 mangle_dupe_cols=True,
                 tupleize_cols=False,
                 infer_datetime_format=False):

За исключением пути к файлу, большинство из них являются ортогональными параметрами, которые определяют различные аспекты анализа файла CSV.Нет конкретной причины, по которой они должны передаваться в каком-то определенном порядке.Вы бы с ума сошли, следя за любым позиционным порядком для них.Разумнее передать их как ключевые слова.

Теперь вы можете видеть, что pandas на самом деле не определяет их как аргументы, содержащие только ключевые слова, предположительно для обеспечения совместимости с Python 2.Я предполагаю, что многие библиотеки воздерживаются от использования синтаксиса по той же причине.Я не знаю навскидку, какие библиотеки (если таковые имеются) начали его использовать.

Другие советы

Для тех, кто приходит из или / и использовал ruby

ниже выражения в Python

def f(a, b, *, c=1, d=2, e=3):
.

похож на

def f(a,b, options={})
  c = options[:c] || 1
  d = options[:d] || 2
  e = options[:e] || 3
end
.

в Руби.

С, Python IS Явный лучше, чем неявный langauge, это требует * (Splat) Оператор по параметрам.

PS: я никогда не использовал Python, если я ошибаюсь, пожалуйста, исправьте меня.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top