Передача "списков аргументов" как именованного кортежа в 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):
...