Самый безопасный способ удалить порядок аргументов и одновременно предоставить значения по умолчанию в Python
Я пытаюсь написать код Python 2.7, который легче масштабировать, удаляя порядок аргументов и предоставляя значения по умолчанию в случае изменения требований. Вот мой код:
# Class:
class Mailer(object):
def __init__(self, **args):
self.subject=args.get('subject', None)
self.mailing_list=args.get('mailing_list', None)
self.from_address=args.get('from_address', None)
self.password=args.get('password', None)
self.sector=args.get('sector', "There is a problem with the HTML")
# call:
mailer=Mailer(
subject="Subject goes here",
password="password",
mailing_list=("email@email.com", "email@email.com","email@email.com"),
mailing_list=("email@email.com", "email@email.com"),
from_address="email@email.com",
sector=Sector()
)
Я все еще плохо знаком с языком, поэтому, если есть лучший способ добиться этого, я бы очень хотел знать. Заранее спасибо.
2 ответа
Попробуйте этот способ инициализации вашего класса:
class Mailer(object):
def __init__(self, **args):
for k in args:
self.__dict__[k] = args[k]
Проблема с тем, как вы это делаете, заключается в том, что нет документации о том, какие аргументы принимает класс, поэтому help(Mailer)
бесполезно. Что вы должны сделать, это предоставить значения аргументов по умолчанию в __init__()
метод, где это возможно.
Чтобы установить аргументы в качестве атрибутов в экземпляре, вы можете использовать небольшой самоанализ, как в другом ответе, который я написал, чтобы избежать всей проблемы self.foo = foo
вещи.
class Mailer(object):
def __init__(self, subject="None", mailing_list=(),
from_address="noreply@example.com", password="hunter42",
sector="There is a problem with the HTML"):
# set all arguments as attributes of this instance
code = self.__init__.__func__.func_code
argnames = code.co_varnames[1:code.co_argcount]
locs = locals()
self.__dict__.update((name, locs[name]) for name in argnames)
Вы можете предоставить аргументы в любом порядке, если вы делаете вызов с использованием явных имен аргументов, независимо от того, как они определены в методе, поэтому ваш пример вызова будет работать.