Самый безопасный способ удалить порядок аргументов и одновременно предоставить значения по умолчанию в 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)

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

Другие вопросы по тегам