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.

Другие вопросы по тегам