Аргоны и kwargs Python когда-либо называли что-то еще на практике? - PullRequest
0 голосов
/ 07 декабря 2018

Python не ограничивает имена параметров, однако некоторые имена параметров строго регулируются соглашениями, такими как self, cls, args и kwargs.Имена self и cls всегда представляют одну и ту же концепцию, поэтому в этих случаях мне трудно найти убедительную причину для кого-то отклониться от соглашения.Однако с args и kwargs я нахожу это соглашение о присвоении имен удушающим.

Скажем, у меня есть класс, который имеет различные свойства, которые можно установить с помощью передачи kwargs его конструктору:

class MyObj:
    def __init__(self, **kwargs):
        for propname in kwargs:
            self.set_property(propname, kwargs[propname])

В этом случае kwargs предназначены только для того, чтобы быть настраиваемыми свойствами экземпляра этого класса, поэтому для меня было бы целесообразно написать определение следующим образом:

class MyObj:
    def __init__(self, **properties):
        for propname in properties:
            self.set_property(propname, properties[propname])

Таким образом, одинДостаточно взглянуть на сигнатуру метода, чтобы понять, для чего нужны карги.

В общем, я считаю, что соглашение - это хорошая вещь.Однако мне кажется, что всегда использование args и kwargs - упущенная возможность донести полезную информацию до пользователя API о природе аргументов функции / метода и kwargs.В конце концов, тот факт, что они являются неназванными или именованными аргументами, становится понятным благодаря наличию одинарной или двойной звездочки.

Есть ли у кого-нибудь примеры альтернативных имен для args и kwargs, используемых в реальном мире,код для нескольких разработчиков или просто слишком сложно использовать другие имена переменных для этих конструкций?

Если на самом деле это просто ужасная, ужасная идея - не использовать эти условные имена, в чем причина?

1 Ответ

0 голосов
/ 07 декабря 2018

Я не вижу никакой причины против использования специфичных для контекста имен, таких как ...

my_sum(*numbers), my_parser(*strings, **flags) и т. Д.

print документы говорят *objects.

zip документы говорят *iterables.

itertools.chain использует *iterablesв документах и ​​в строке документов.

>>> from itertools import chain
>>> chain.__doc__.splitlines()[0]
'chain(*iterables) --> chain object'

collections.ChainMap использует *maps в документах и ​​__init__.

>>> from collections import ChainMap
>>> from inspect import signature
>>> signature(ChainMap.__init__)
<Signature (self, *maps)>

Feel freeискать больше примеров.

...