Я пытаюсь установить функцию, чтобы сделать что-то вроде этого
def __binaryTreeInsert(self, toInsert, currentNode=getRoot(), parentNode=None):
где текущий node начинается с root, а затем мы меняем его на другой node в методе и рекурсивно вызываем его снова.
Однако я не могу заставить "currentNode = getRoot()" работать. Если я попробую назвать funcion getRoot() (как указано выше), он говорит, что im не дает ему все необходимые переменные, но если я пытаюсь вызвать self.getRoot(), он жалуется, что self является переменной undefined. Есть ли способ, которым я могу это сделать, не указывая корень при вызове этого метода?
EDIT: базовый случай этого метода уже
if currentNode == None:
поэтому использование этого для установки корня не будет работать
В то время как arg=None
является идиоматическим значением Python для аргумента, не связанного с поставкой, он не должен быть None
. В Lua, например, идиоматический аргумент без аргумента - пустая таблица. Фактически мы можем применить это к этому случаю:
class Foo:
sentinel = {}
def bar(self, arg=sentinel):
if arg is self.sentinel:
print "You didn't supply an argument!"
else:
print "The argument was", arg
f = Foo()
f.bar(123)
f.bar()
f.bar(None)
f.bar({})
Вывод:
The argument was 123 You didn't supply an argument! The argument was None The argument was {}
Это работает для любого случая, кроме явно переданного Foo.sentinel
, потому что Foo.sentinel
гарантированно имеет уникальный адрес - значение, x is Foo.sentinel
является истинным только тогда, когда x является Foo.sentinel
:) Таким образом, из-за закрытия мы создали вокруг Foo.sentinel
, есть только один объект, который может создать неоднозначную ситуацию, и он никогда не будет использоваться случайно.
object
а не ничего, чтобы использовать классы нового стиля.
Когда определена функция или метод, строка def
оценивается немедленно, включая любые аргументы ключевых слов. По этой причине такие вещи, как вызовы функций и изменяемые объекты, обычно не подходят для аргументов по умолчанию.
Вместо этого решение должно использовать контрольное значение. None
является наиболее распространенным явлением, но для случаев, когда None
будет допустимым значением, вы можете использовать другой контрольный сигнал, например:
not_provided = object()
def _binaryTreeInsert(self, toInsert, currentNode=not_provided, parentNode=None):
if currentNode is not_provided:
currentNode = self.getRoot()
Вы можете сделать
def __binaryTreeInsert(self, toInsert, currentNode=None, parentNode=None):
if currentNode is None:
currentNode = self.getRoot()
...
None
или нет.
def __binaryTreeInsert(self, toInsert, currentNode=0, parentNode=None):
if not currentNode:
currentNode = self.getRoot()
getRoot
, очевидно, является функцией уровня модуля без аргументов? Используете ли вы глобальное пространство имен модуля, когда вам нужен экземпляр класса, или вы забыли оself
, или я что-то упустил?is None
как правило, предпочтительнее, чем== None
.