'선언적 비단뱀'에서 유용 할 수 있습니다.예를 들어 아래의 FooDef
및 BarDef
은 일련의 데이터 구조를 정의하는 데 사용되는 클래스로, 일부 패키지가 입력 또는 구성으로 사용합니다. 이렇게하면 입력 내용에 많은 유연성을 부여 할 수 있으며 파서를 작성할 필요가 없습니다. 이 구성 파일이 Foo_other
의 구성의 일부인 이름의 목록을 구축하기 위해 루프를 사용하는
# FooDef, BarDef are classes
Foo_one = FooDef("This one", opt1 = False, valence = 3)
Foo_two = FooDef("The other one", valence = 6, parent = Foo_one)
namelist = []
for i in range(6):
namelist.append("nm%03d"%i)
Foo_other = FooDef("a third one", string_list = namelist)
Bar_thing = BarDef((Foo_one, Foo_two), method = 'depth-first')
참고. 그래서,이 설정 언어는 매우 강력한 '선처리 프로세서'와 함께 사용 가능한 런타임 라이브러리를 제공합니다. 예를 들어 구성을 생성 할 때 복잡한 로그를 찾거나 zip 파일에서 항목을 추출하고 base64를 디코드하려는 경우 (이 방법은 물론 권장되지 않습니다. 당신이 원하는 경우, 이러한 패키지를 사용하는 경우 globals()
가 유용합니다, 그래서
conf_globals = {} # make a namespace
# Give the config file the classes it needs
conf_globals['FooDef']= mypkgconfig.FooDef # both of these are based ...
conf_globals['BarDef']= mypkgconfig.BarDef # ... on .DefBase
fname = "user.conf"
try:
exec open(fname) in conf_globals
except Exception:
...as needed...
# now find all the definitions in there
# (I'm assuming the names they are defined with are
# significant to interpreting the data; so they
# are stored under those keys here).
defs = {}
for nm,val in conf_globals.items():
if isinstance(val,mypkgconfig.DefBase):
defs[nm] = val
, 마지막 지점에 도착 : 신뢰할 수없는 소스 ...)
패키지는 다음과 같은 것을 사용하여 구성을 읽고 절차 적으로 일련의 정의를 작성하십시오 :
for idx in range(20):
varname = "Foo_%02d" % i
globals()[varname]= FooDef("one of several", id_code = i+1, scale_ratio = 2**i)
,
이
Foo_00 = FooDef("one of several", id_code = 1, scale_ratio=1)
Foo_01 = FooDef("one of several", id_code = 2, scale_ratio=2)
Foo_02 = FooDef("one of several", id_code = 3, scale_ratio=4)
... 17 more ...
에게 파이썬 모듈에서 정의의 무리를 수집하여 그 입력을 획득하고 패키지의 일례를 작성 동등하면 PLY (파이썬 렉스-은 yacc) http://www.dabeaz.com/ply/하다 -이 경우에 객체는 대부분 함수 객체이지만 함수 객체의 메타 데이터 (이름, 문서 문자열 및 정의 순서)도 입력의 일부를 형성합니다. globals()
을 사용하는 것은 좋은 사례가 아닙니다. 또한 '구성'에 의해 가져옵니다. 후자는 일반적인 파이썬 스크립트입니다.
필자가 작업 한 몇 개의 프로젝트에서 '선언적 python'을 사용했으며, 구성을 작성할 때 globals()
을 사용할 기회가있었습니다. 당신은 이것이 구성 '언어'가 디자인 된 방식의 약점 때문이라고 확실히 말할 수 있습니다. 이 방법으로 globals()
을 사용하더라도 매우 명확한 결과가 나오지 않습니다. 거의 동일한 진술을 12 개 이상 작성하는 것보다 유지하기가 더 쉬운 결과 일뿐입니다.
또한 자신의 이름에 따라, 구성 파일 내에서 변수의 의미를 부여하는 데 사용할 수 있습니다 :
# All variables above here starting with Foo_k_ are collected
# in Bar_klist
#
foo_k = [ v for k,v in globals().items() if k.startswith('Foo_k_')]
Bar_klist = BarDef(foo_k , method = "kset")
이 방법은 테이블과 구조의 많은 영역을 정의하는 파이썬 모듈이 유용 할 수있다, 참조를 유지 관리 할 필요없이 항목을 데이터에 더 쉽게 추가 할 수 있습니다.
"하지만 같은 이름의 변수가 두 개 있고 같은 범위 내에서 둘 다 사용해야하는 문제는 절대로 있어서는 안됩니다." 나는이 생각을 따를 수 없다. 이것이 서로 다른 네임 스페이스의 다른 이유입니다. 서로 다른 범위에서 같은 이름의 변수를 사용한다는 것입니다. 둘 중 하나를 사용하여 작업 할 때 중복 된 이름은 자연스러운 것이지만 접두어로 사용할 수 있으므로 문제는 아닙니다. – Michael
글쎄, 나는 C++ 계열에서 왔기 때문에 파이썬 사람들에 대해서는 잘 모르겠다.하지만 내가 생각할 수있는 한, 고유 한 이름을 가지고 있지 않은 글로벌 변수는 없어야한다. 동일한 범위의 동일한 이름의 변수가 내게 어리석은 문장이지만, 지역의 이름과 동일한 이름의 전역 변수는 아닙니다. 그 때 나는 네임 스페이스를 로컬 네임 스페이스에 사용할 것입니다 ... 그러나 그렇게 말하면 모르겠습니다. –
@Mahi :'globalals'은 아마도 약간의 오해를 불러 일으킬 것입니다. 'globals()'는 본질적으로 모듈의'locals()'입니다.가장 가까운 파이썬은 모든 프로그램에서 전역 적으로 전역 변수에 온다. ['__builtin__' 모듈] (http://docs.python.org/library/__builtin__.html); * 그 * 모듈에 추가하는 것은 모든 곳의 모든 네임 스페이스에서 사용할 수있게됩니다. –