bpython -i & пространства имен - PullRequest
       29

bpython -i & пространства имен

0 голосов
/ 29 августа 2011

Кажется, я нигде не могу найти этот ответ.

Учитывая тривиальный пример:

# 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 существует - как и сама основная функция.

В любом случае я могу перетащить любые объекты, которые существуют в этой основной функции, в пространство имен, в котором я нахожусь, когда захожу в это интерактивное приглашение?Или есть что-то еще, что я должен сделать?

Ответы [ 3 ]

1 голос
/ 29 августа 2011

my_class_instance находится в пространстве имен main, поэтому вы не можете видеть его за пределами main. Вместо этого используйте глобальный:

my_class_instance = None

def main():
    global my_class_instance

    my_class_instance = MyClass()
0 голосов
/ 24 мая 2018

При использовании интерактивного 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()
0 голосов
/ 14 марта 2012

Еще один прием, который я иногда использую, когда хочу, чтобы что-то вернулось от запуска основной функции, - это вернуть то, что мне нужно, в конце основной.

Так, например, если мне нужен экземпляр и некоторая другая переменная из главной функции на верхнем уровне, можно сделать:

def main():
    myclass = MyClass()
    a = 4
    return (my class, a)

if __name__ == '__main__':
    ret = main()

Если вы теперь вызываете свой скрипт с помощью bpython -i scriptname, у вас будет переменная 'ret' в глобальном пространстве имен, а ret [0] содержит ваш экземпляр класса, ret [1] имеет номер 4.

...