2016-06-10 3 views
1

В соответствии с этим Question's accepted answer, я понимаю, что я не могу создавать чистые глобальные переменные. ОК, круто.Доступ к переменной из внешней области с помощью ключевого слова global в Python

Однако, затем он идет дальше и говорит:

[..] все, что вы можете сделать, это сделать переменную в конкретной области. (Если вы сделаете переменную внутри интерпретатора Python, а затем импортировать другие модули, переменная находится в наружном объеме и, таким образом, глобальный в вашей Python сессии. [..]

Итак, мы не можем назначить globals в исходном смысле, но, возможно, можно получить доступ к переменным в самом удаленном объеме изнутри пакета, с помощью ключевого слова global, правильно?

Я, по-видимому, не вижу в моих усилиях доступа к переменная, переданная моей программе python через аргументы командной строки.

Моя программа имеет обычный __main__.py, который обрабатывает разбор аргументов и выполняет код из моего модуля python backend.

backend имеет код, который полагается на ввод через аргументы командной строки. Тем не менее, я, кажется, не могу сделать эти аргументы доступными для backend. макет

Мой пакет является:

mypackage 
- __main__.py 
- backend/ 
    -__init__.py 
    -direction.py 

Вот __main__.py:

import argparse 

# Setup ArgParser 
parser = argparse.ArgumentParser(description="Fancy Description of program.") 
parser.add_argument('--tar', nargs=1, dest='target', 
       help='Specify output folder.', 
       default=['/path/to/output']) 

target_dir = args.target[0] 

# Import backend now that our variable is set. 
from backend.direction import direction 

И мой backend/direction.py:

global target_dir 
print(target_dir) 

Запуск этого поднимает NameError: 'target_dir' is not defined. Так где же корма? Я предполагаю невозможность здесь, или я просто испортил объявление?

+0

Когда мы говорим 'global', это означает, что переменная определена где-то во внешней области. Он не будет видимым для других модулей. (Каждый созданный вами файл является модулем в Python). Таким образом, вам нужно явно «импортировать» модуль для доступа к переменной. – thefourtheye

+0

Итак, в моем случае я импортирую '__main__' в свой' direction.py'? Это звучит не так, как будто это должно быть сделано (?). Можно ли вместо этого загружать переменную из файла в качестве обходного пути? – nlsdfnbch

+0

@ j4ck По правде говоря, вы, вероятно, вообще не должны использовать глобальные переменные. Если вам нужно их использовать, лучше всего держать их в привязке к одному модулю (см. [PEP8] (https://www.python.org/dev/peps/pep-0008/#global-variable-names)) , –

ответ

5

global работает только в модуле он используется. Вы также не использовать global для объявить глобальной переменной в глобальной области (то есть. Объем модуля). Вы должны использовать global в рамках функции, чтобы указать, что вы хотите использовать переменную в глобальной области действия, а не в локальной области.

В Python 3, есть также nonlocal ключевое слово, которое позволяет указать, что вы хотите изменить переменную во внешней области видимости , что не глобальный/модуль сфера.

глобальный

A = 1 

def global_func(): 
    global A 
    A = 2 


def func(): 
    A = 3 


print(A) 
# 1 

global_func() 
print(A) 
# 2 

func() 
print(A) 
# 2 

нелокальной

def outside(): 
    a = 1 

    def inside_nonlocal(): 
     nonlocal a 
     a = 2 

    def inside(): 
     a = 3 

    print(a) 
    # 1 

    inside_nonlocal() 
    print(a) 
    # 2 

    inside() 
    print(a) 
    # 2 
0

Я не ясно, что ваша проблема на самом деле. Нельзя ли сделать следующее?

import backend 

if __name__ == "__main__": 
    # parse arguments 
    backend.argreceive(arguments) 

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

class argreceive(): 
    def __init__(self,args): 
     self.args = args