Лично мне не нравится повторение инициализации ключа перед циклом while, а затем снова внутри цикла. Это возможный источник ошибок; что произойдет, если кто-то отредактирует одну из двух инициализаций и забудет отредактировать другую? Даже если этого никогда не произойдет, любой, кто читает код, должен тщательно проверить, чтобы убедиться, что обе инициализации идеально совпадают.
Я бы написал так:
while True:
thekey = random.choice(tree.thedict.keys())
subtree = tree.thedict[thekey]
if subtree.parent is not None and not subtree.isRoot:
break
P.S. Если вы действительно хотите получить поддерево и не заботитесь о ключе, необходимом для поиска поддерева, вы можете даже сделать это:
while True:
subtree = random.choice(tree.thedict.values())
if subtree.parent is not None and not subtree.isRoot:
break
Некоторым людям может не понравиться использование "while True:
", но это стандартная идиома Python для "цикла навсегда, пока что-то не запустится break
". ИМХО это простой, понятный идиоматичный Python.
P.P.S. Этот код действительно должен быть заключен в оператор if, который проверяет, что дерево имеет более одного узла. Если дерево имеет только корневой узел, этот код будет зацикливаться вечно.