Мой простой ответ - просто передать сам интерпретатор и позволить объекту изменить соответствующее свойство интерпретатора.Если вы не хотите слишком сильно отделяться от формата, который у вас уже есть, вы могли бы дать функции evaluate()
два аргумента:
def evaluate(interpreter, field_name):
interpreter.setattr(field_name, some_value)
, которые вы затем назвали бы как
active.evaluate(self, "var")
Однако это кажется хорошим местом для реализации полиморфизма, который решит как проблему, о которой вы спрашиваете, так и устранит необходимость в растущем стеке if
операторов.
Во-первых,допустим, у вас есть суперкласс для команд:
class Command:
def complete():
# do something, return a boolean
def evaluate(interpreter):
raise NotImplementedException()
В настоящее время кажется, что вы используете команду return_type
, чтобы изменить то, что вы делаете с командой.Но почему бы просто не определить, какой тип команды будет выполняться, и создать экземпляр другого подкласса с другим поведением соответственно?
class GotoCommand(Command):
def evaluate(interpreter):
interpreter.current = some_value
class PacketCommand(Command):
def evaluate(interpreter):
interpreter.stream = some_other_value
...
, после чего вы можете просто вызвать active.evaluate(self)
в интерпретаторе, даже не имеявсе равно, что это за команда.