2014-08-05 1 views
2

Есть ли способ сделать следующее?Python «self» не определен в списке аргументов функции

def getTables(self, db = self._dbName): 
    //do stuff with db  
    return func(db) 

Я получаю "self" is not defined. Я мог бы это сделать ...

def getTables(self, db = None): 
    if db is None: 
     db = self._db 
    //do stuff with db 
    return func(db) 

... но это просто раздражает.

+0

Являются ли эти автономные функции или методы? – That1Guy

+0

Вы хотите установить значение по умолчанию для аргумента, основанное на других аргументах? – Lix

+0

правильный способ сделать это: def getTables (self, db = None): – levi

ответ

8

Подписи функций оцениваются , когда функция определена, а не при вызове функции.

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

Если быть точным: выражения для тела класса выполняются до создания объекта класса. Выражения для значений по умолчанию для функций выполняются до создания объекта функции. В этот момент вы не можете создать экземпляр для привязки self.

Как таковой, использование дозорного устройства (например, None) на самом деле является вашим единственным вариантом. Если db никогда не falsey вы можете просто использовать:

def getTables(self, db=None): 
    db = db or self._db 
+2

+1 - гораздо лучший ответ, чем мой, поскольку понимание этого важно для понимания (например), почему 'def foo (bar = {})' is Evil And Wrong (совместное использование одного, изменяемого '{}' объекта, а не создавать новый dict для каждого вызова). –

+0

ok за действительный ответ. В этом есть смысл. – dylnmc

1

Возможно, это onle лайнер версия будет немного меньше «раздражает»:

def getTables(self, db = None): 
    db = self._db if db is None else db 
    ... 

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

+0

Я просто не хочу утверждения if вообще. Я хочу это в списке параметров функции – dylnmc

+0

@ Dylan - да ... но как насчет того, что хочет * интерпретатор * python *? ;) – Lix