переменные экземпляра Python как дополнительные аргументы

В настоящее время я использую следующую функцию для получения списка имен и вызова getattr(m, name) для каждого имени:

def public_members(module):
    try:
        return module.__all__  # If not iterable, imports will break.
    except AttributeError:
        return [name for name in dir(module) if not name.startswith('_')]
7
задан 15 May 2009 в 05:40
поделиться

5 ответов

Попробуйте следующее:

def foo(self, blah=None):
    if blah is None: # faster than blah == None - thanks to kcwu
        blah = self.instance_var
13
ответ дан 6 December 2019 в 10:03
поделиться

Все ответы, предполагающие Нет , верны; если вы хотите убедиться, что вызывающий может передать None в качестве обычного аргумента, используйте специальный дозорный и проверьте с помощью :

class Foo(object):
  __default = object()
  def foo(self, blah=Foo.__default):
    if blah is Foo.__default: blah = self.instavar

Каждый вызов object () создает уникальный объект, так что равно никогда не будет успешным между ним и любым другим значением. Два символа подчеркивания в __ default означают «строго конфиденциальный», что означает, что вызывающие абоненты знают, что не должны пытаться с ним связываться (и для этого потребуется довольно много работы, явно имитируя искажение имени, что компилятор является do).

Причина, по которой вы не можете просто использовать опубликованный вами код, кстати, заключается в том, что значения по умолчанию оцениваются, когда вычисляется оператор def , а не позже во время вызова;

5
ответ дан 6 December 2019 в 10:03
поделиться

нет, потому что экземпляр не существует, когда время определения функции класса

Вам необходимо переписать следующим образом

def function(self, arg1=val1, arg2=val2, arg3=None):
    if arg3 is None:
        arg3 = self.instance_var

Это немного отличается от исходного: вы не можете передать arg3 со значением None, если действительно хотите.

Альтернативное решение:

def function(self, arg1=val1, arg2=val2, **argd):
    arg3 = argd.get('arg3', self.instance_var)
2
ответ дан 6 December 2019 в 10:03
поделиться

Альтернативный способ сделать это:

def foo(self, blah=None):
    blah = blah or self.instance_var

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

Используйте с осторожностью. См. Комментарии ниже ...

-1
ответ дан 6 December 2019 в 10:03
поделиться
def foo(self, blah=None):
    blah = blah if not blah is None else self.instance_var

Это работает с питоном 2.5 и вперёд и обрабатывает случаи, когда бла - это пустые строки, списки и так далее.

0
ответ дан 6 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: