[python] 파일 사이에 전역 변수를 사용합니까?

전역 변수가 어떻게 작동하는지 혼란 스럽습니다. 약 50 개의 파일이있는 큰 프로젝트가 있으며 모든 파일에 대해 전역 변수를 정의해야합니다.

내가 한 것은 프로젝트 main.py파일에서 다음과 같이 정의했습니다 .

# ../myproject/main.py

# Define global myList
global myList
myList = []

# Imports
import subfile

# Do something
subfile.stuff()
print(myList[0])

다음과 같이 myList에서 사용하려고합니다.subfile.py

# ../myproject/subfile.py

# Save "hey" into myList
def stuff():
    globals()["myList"].append("hey")

다른 방법으로 시도했지만 작동하지 않았습니다.

# ../myproject/main.py

# Import globfile    
import globfile

# Save myList into globfile
globfile.myList = []

# Import subfile
import subfile

# Do something
subfile.stuff()
print(globfile.myList[0])

그리고 subfile.py나는 이것을 가지고 있었다 :

# ../myproject/subfile.py

# Import globfile
import globfile

# Save "hey" into myList
def stuff():
    globfile.myList.append("hey")

그러나 다시 작동하지 않았습니다. 이것을 어떻게 구현해야합니까? 두 파일이 실제로 서로를 알지 못하면 (하위 서브 파일은 주를 알지 못하지만) io writing 또는 pickle을 사용하지 않고 어떻게 해야할지 생각할 수 없습니다. 하고 싶지 않아요



답변

문제는 myList에서 정의 main.py했지만 subfile.py사용해야합니다. 이 문제를 해결하는 확실한 방법은 다음과 같습니다. 모든 전역을 파일로 이동합니다 settings.py. 이 파일을 호출합니다 . 이 파일은 전역을 정의하고 초기화하는 역할을합니다.

# settings.py

def init():
    global myList
    myList = []

다음으로 subfile전역을 가져올 수 있습니다.

# subfile.py

import settings

def stuff():
    settings.myList.append('hey')

참고 subfile호출하지 않습니다 init()– 작업에 속한다는 것을 main.py:

# main.py

import settings
import subfile

settings.init()          # Call only once
subfile.stuff()         # Do stuff with global var
print settings.myList[0] # Check the result

이렇게하면 전역 변수를 두 번 이상 초기화하지 않으면 서 목표를 달성 할 수 있습니다.


답변

모듈 간 전역 변수 공유 에 대한 Python의 문서를 참조하십시오 .

단일 프로그램 내에서 모듈간에 정보를 공유 할 수있는 일반적인 방법은 특수 모듈 (종종 config 또는 cfg)을 작성하는 것입니다.

config.py :

x = 0   # Default value of the 'x' configuration setting

응용 프로그램의 모든 모듈에서 구성 모듈을 가져 오십시오. 그러면 모듈이 전역 이름으로 사용 가능해집니다.

main.py :

import config
print (config.x)

또는

from config import x
print (x)

일반적으로 modulename import * 에서 사용하지 마십시오 . 그렇게하면 수입자의 네임 스페이스가 어수선 해져서 ​​린터가 정의되지 않은 이름을 감지하기가 훨씬 어려워집니다.


답변

파이썬 전역 변수를 “모듈”변수라고 생각하면 C의 전통적인 “전역 변수”보다 훨씬 유용합니다.

전역 변수는 실제로 모듈에 정의되며 해당 모듈 __dict__외부에서 모듈 속성으로 액세스 할 수 있습니다.

따라서 귀하의 예에서 :

# ../myproject/main.py

# Define global myList
# global myList  - there is no "global" declaration at module level. Just inside
# function and methods
myList = []

# Imports
import subfile

# Do something
subfile.stuff()
print(myList[0])

과:

# ../myproject/subfile.py

# Save "hey" into myList
def stuff():
     # You have to make the module main available for the 
     # code here.
     # Placing the import inside the function body will
     # usually avoid import cycles - 
     # unless you happen to call this function from 
     # either main or subfile's body (i.e. not from inside a function or method)
     import main
     main.mylist.append("hey")


답변

를 사용 from your_file import *하면 문제가 해결됩니다. 가져 오기에서 로컬 변수를 제외하고 전 세계에서 사용할 수 있도록 모든 것을 정의합니다.

예를 들면 다음과 같습니다.

##test.py:

from pytest import *

print hello_world

과:

##pytest.py

hello_world="hello world!"


답변

Hai Vu 답변은 한 가지 의견만으로도 효과적입니다.

다른 모듈에서 전역을 사용하고 전역을 동적으로 설정하려는 경우 전역 변수를 설정 한 후 다른 모듈을 가져 오려면 다음과 같이주의하십시오.

# settings.py
def init(arg):
    global myList
    myList = []
    mylist.append(arg)


# subfile.py
import settings

def print():
    settings.myList[0]


# main.py
import settings
settings.init("1st")     # global init before used in other imported modules
                         # Or else they will be undefined

import subfile    
subfile.print()          # global usage


답변

두 번째 시도는 완벽하게 작동하며 실제로 전역에서 사용할 수있는 변수 이름을 처리하는 정말 좋은 방법입니다. 그러나 마지막 줄에 이름 오류가 있습니다. 방법은 다음과 같습니다.

# ../myproject/main.py

# Import globfile    
import globfile

# Save myList into globfile
globfile.myList = []

# Import subfile
import subfile

# Do something
subfile.stuff()
print(globfile.myList[0])

마지막 줄을 보시겠습니까? myList는 서브 파일이 아닌 globfile의 속성입니다. 이것은 당신이 원하는대로 작동합니다.

마이크


답변