В тот или иной момент вы можете встретить функции с множеством аргументов. Иногда имеет смысл объединить некоторые аргументы в супер-аргументы. Я часто делал это с помощью диктовок, но сейчас я смотрю на лучшие способы сделать это.
Я хотел бы включить ...
def do_something(ax, ay, az, bu, bv, c):
# Do something
... в ...
def do_something(a, b, c):
# Do something
... где a
и b
содержат свои подвариации.
Один из способов сделать это состоит в следующем:
A = namedtuple('A', 'x, y, z')
a = A(ax, ay, az)
B = namedtuple('B', 'u, v')
b = B(bu, bv)
Тем не менее, это кажется проще:
a = SimpleNamespace(x=ax, y=ay, z=az)
b = SimpleNamespace(u=bu, v=bv)
В чем недостаток? То, что так a
и b
не набрано? Они не объекты A и B?
(Кстати, не беспокойтесь об именах переменных. Обычно я не использую их как короткие имена.)
python
variables
dictionary
Андре Кристоффер Андерсен
источник
источник
Ответы:
SimpleNamespace
это просто красивый фасад поверх словаря. Это позволяет использовать свойства вместо индексных ключей. Это приятно, так как он очень гибкий и простой в управлении.Недостатком этой гибкости является то, что она не обеспечивает никакой структуры. Ничто не мешает кому-то звонить
SimpleNamespace(x=ax, y=ay)
(иdel a.z
в какой-то момент позже). Если этот экземпляр передается вашей функции, исключение возникает при попытке доступа к полю.Напротив,
namedtuple
позволяет создавать структурированный тип. Тип будет иметь имя, и он будет знать, какие поля он должен иметь. Вы не сможете создать экземпляр без каждого из этих полей, и они не могут быть удалены позже. Кроме того, экземпляр является неизменным, поэтому вы будете знать, что значениеa.x
всегда будет одинаковым.Вы сами решаете, нужна ли вам гибкость
SimpleNamespace
, или вы предпочитаете иметь структуру и гарантии, предоставляемые вамиnamedtuple
.источник
Мне очень нравится ответ о структурированных, а не нет, поэтому я просто приведу конкретный пример ниже.
SimpleNamespace
примет ключи, которые начинаются с_
. Если вы ищете быстрый и простой способ преобразования, скажем, JSON, который вы не управляете объектами с именами полей, это очень удобно:Обратите внимание, что вы видите, что это
namedtuple
дает нам целый дополнительный объект, которыйSimpleNamespace
никогда не будет. Каждая изSimpleNamespace
них на самом деле является «уникальной снежинкой», хотяnamedtuple
существует без каких-либо конкретных значений. Везде, где вам нужны абстракции, которые обобщают конкретные значения, вам, вероятно, следует отдавать предпочтение.источник
Резюме
SimpleNamespace
Это позволяет инициализировать атрибуты при построении объекта:
Обеспечивает читабельный
Он отменяет сравнение по умолчанию. Вместо сравнения
id()
, он сравнивает значения атрибутов.источник