Передача "списков аргументов" как именованного кортежа в python

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

Engine = namedtuple('Engine', 'website, browser, s, e')
engine = Engine(website, browser, s(), e())

у меня есть функция, download(engine) что я прохожу engine в. Подфункции в download проходить engine- некоторые из них используют websiteнекоторые из них используют browserнекоторые из них используют sи некоторые используют e,

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

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

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

2 ответа

Решение

Я бы сказал, что на самом деле это очень хорошая модель. namedtuples очень эффективны и повышают читабельность. Их служебное пространство по сравнению с обычными кортежами фактически равно нулю.

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

Раймон Хеттингер (Raymond Hettinger) довольно подробно объясняет их преимущества и варианты использования в этом выступлении от PyCon US 2011 [11:35 - 26:00]гораздо лучше, чем когда-либо мог.

Это звучит как некий вариант шаблона объекта параметра. С другой стороны, звучит так, как будто вы могли бы реализовать его как класс, т.е.

class Engine(object):
   website = ...
   browser = ...
   s = ...
   e = ...

   def download(self):
       ...
   def _sub_function(self):
       ...
Другие вопросы по тегам