Документация Python для os.removexattr, что означает аргумент «*» (звездочка)?

Мой первый вопрос, пожалуйста, будьте нежны. Я искал, но не смог найти ответ ни здесь, ни где-либо еще.

Обратите внимание, что этот вопрос не относится к распаковке таких аргументов, как *args.

В документации по Python 3.3 для os.removexattr указано следующее:

os.removexattr(path, attribute, *, follow_symlinks=True)

    Removes the extended filesystem attribute attribute from path.
    attribute should be bytes or str. If it is a string, it is encoded
    with the filesystem encoding.

    This function can support specifying a file descriptor and not
    following symlinks.

Обратите внимание, что третий аргумент — это звездочка: *

Я предположил, что это означает «указать один атрибут или несколько атрибутов, разделенных запятой», но при попытке сделать это я получаю исключение:

import os
os.removexattr('M7-AAE-01.jpg', 'user.camera_brand', 'user.camera_model')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: Function takes at most 2 positional arguments (3 given)

Я также пытался предоставить список аргументов, но это тоже не сработало.

Что именно означает звездный аргумент в данном случае? Спасибо.


person user3122335    schedule 28.12.2013    source источник


Ответы (1)


Одна звездочка * просто означает, что она заставляет вас использовать именованные аргументы. В этом случае, если вы хотите передать значение для follow_symlinks, вы должны передать имя аргумента.

Идея в том, что вам не нужно читать такие вызовы функций, как foo(True, False, False), и не знать, что делают эти значения.

person Greg Ennis    schedule 28.12.2013
comment
Спасибо за ваш ответ. Я просмотрел еще несколько примеров документации Python и понял, что аргумент * всегда используется перед именованными аргументами, так что это определенно правильный ответ. Однако я должен сказать, что это довольно сбивает с толку, поскольку кажется, что звезда была бы еще одним магическим аргументом. Вместо этого следует интерпретировать это как аргумент *, указывающий, что любые аргументы в дальнейшем являются именованными аргументами. Что-то такое... - person user3122335; 29.12.2013
comment
@ user3122335: ну, похоже, ваше наблюдение не универсально; например os.utime(path, times=None, *, [ns, ]dir_fd=None, follow_symlinks=True). Или ns здесь также является аргументом ключевого слова? - person equaeghe; 08.01.2016
comment
Из справочника Python (docs.python.org/3/reference/): параметры после «*» или «*identifier» являются параметрами только с ключевым словом и могут передаваться только с использованием аргументов ключевого слова. - person equaeghe; 08.01.2016