В настоящее время я использую следующую функцию для получения списка имен и вызова 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('_')]
Попробуйте следующее:
def foo(self, blah=None):
if blah is None: # faster than blah == None - thanks to kcwu
blah = self.instance_var
Все ответы, предполагающие Нет
, верны; если вы хотите убедиться, что вызывающий может передать None в качестве обычного аргумента, используйте специальный дозорный
и проверьте с помощью
:
class Foo(object):
__default = object()
def foo(self, blah=Foo.__default):
if blah is Foo.__default: blah = self.instavar
Каждый вызов object ()
создает уникальный объект, так что равно
никогда не будет успешным между ним и любым другим значением. Два символа подчеркивания в __ default
означают «строго конфиденциальный», что означает, что вызывающие абоненты знают, что не должны пытаться с ним связываться (и для этого потребуется довольно много работы, явно имитируя искажение имени, что компилятор является do).
Причина, по которой вы не можете просто использовать опубликованный вами код, кстати, заключается в том, что значения по умолчанию оцениваются, когда вычисляется оператор def
, а не позже во время вызова;
нет, потому что экземпляр не существует, когда время определения функции класса
Вам необходимо переписать следующим образом
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)
Альтернативный способ сделать это:
def foo(self, blah=None):
blah = blah or self.instance_var
Эта более короткая версия выглядит лучше, особенно когда имеется более одного необязательного аргумента.
Используйте с осторожностью. См. Комментарии ниже ...
def foo(self, blah=None):
blah = blah if not blah is None else self.instance_var
Это работает с питоном 2.5 и вперёд и обрабатывает случаи, когда бла - это пустые строки, списки и так далее.