bpython -i & пространства имен
Я не могу найти этот ответ нигде.
Приведенный тривиальный пример:
# myclass.py
class MyClass:
def __init__(self):
print 'test'
def main():
my_class_instance = MyClass()
if __name__ == '__main__':
main()
some_var = 'i exist! ... but I think I'm in global namespace?'
Если я запускаю bpython -i myclass.py, я запускаю программу и захожу в среду bpython. В каком бы пространстве имен я ни находился - my_class_instance не существует. Тем не менее, some_var существует - как и сама функция main.
Есть ли в любом случае, что я могу вытянуть любые объекты, которые существуют в этой главной функции в пространство имен, в котором я нахожусь, когда я захожу в это интерактивное приглашение? Или я должен сделать что-то еще?
3 ответа
my_class_instance
в main
пространство имен, так что вы не можете видеть его вне main
, Вместо этого используйте глобальный:
my_class_instance = None
def main():
global my_class_instance
my_class_instance = MyClass()
Используя интерактивный bpython поверх python 2.7, __name__
равно __console__
, Так твоя функция main()
может никогда не позвонить. Взломать было бы написать:
# myclass.py
class MyClass:
def __init__(self):
print 'test'
def main():
global my_class_instance
my_class_instance = MyClass()
if __name__ in ('__main__', '__console__'):
main()
Другой прием, который я иногда использую, когда хочу, чтобы что-то вернулось от запуска основной функции, - это вернуть то, что мне нужно, в конце основной.
Так, например, если мне нужен экземпляр и некоторая другая переменная из главной функции на верхнем уровне, можно сделать:
def main():
myclass = MyClass()
a = 4
return (my class, a)
if __name__ == '__main__':
ret = main()
Если вы теперь вызываете свой скрипт с помощью bpython -i scriptname, у вас будет переменная 'ret' в глобальном пространстве имен, а ret[0] будет иметь ваш экземпляр класса, ret[1] будет иметь номер 4.