2009-08-14 3 views
4

이의 내가이 있다고 가정 해 봅시다 :다른 지역에서 현지인을 전달하고 변수에 직접 액세스하려면 어떻게해야합니까?


def a(dict): 
    locals().update(dict) 
    print size 

def b(): 
    size = 20 
    f(locals()) 

내가이 a 기능에서 직접 size 변수에 액세스하려면 어떻게해야합니까? 나는 알고있다 :


size = dict["size"] 

그러나 나는 더 직접적인 방법이 있어야한다고 생각한다. locals().update(dict)을 사용해 보았지만 작동하지 않았습니다. 더 좋은 방법이 있습니까?

+2

너 진짜하려고? – SilentGhost

+0

'locals [ "size"]'가 아닌 변수를 직접 액세스하고 싶습니다. – Geo

+4

큰 그림은 무엇입니까? 아마 더 좋은 방법이있을 것입니다. – sykora

답변

12

파이썬 컴파일러는 컴파일 타임에 함수가 액세스하고있는 barenames가 로컬인지 (즉, 함수 내에 할당 된 바알 마임 또는 다른 방법으로 바인딩되어 있는지)를 인식하여 로컬 변수에 대한 액세스를 최적화합니다. 그래서 당신이 경우 코드 :

def lv1(d): 
    locals().update(d) 
    print zap 

컴파일러가 barename zap가 (기능 lv1에 할당되지 않은) 그래서 대신 글로벌로 액세스하는 코드를 컴파일 지역이 아니다 "알고있다"- 어떤 d 포함하지 않습니다 문제. 컴파일러 키워드 exec을 볼 때, 그것은 당신이 당신의 코드가 아니라, 천천히 부풀어 및 버그 만들려고 노력하는 거 알아 - 당신이 느리고 비 대한 코드를 선호하는 경우

, 당신은 함수 내부에 exec을 사용하여 최적화를 물리 칠 수 있습니다 가능한 한 최적화하고 어떤 식 으로든 최적화하지 않음으로써 협력합니다.

그래서, 다음 코드는 사용자가 원하는대로 작동합니다 : 당신이 원하는대로

def lv1(d): 
    exec "" 
    locals().update(d) 
    print zap 

lv1({'zap': 23}) 

23을 방출한다.

나는이 기술이 권장되지 않는 위의 "무표정한 유머"분명 희망,하지만 난 더 나은 아주 명시 적으로 맞추는 것 : print locals()['zap'] 대신 print zap를 작성하는 반신 반의하는 구문 즐거움을 위해, 당신은을 지불하고 성능 측면에서 상당한 가격.그래도 실제 경험이 풍부한 전문가 수준의 프로그래머가 실제로 무엇을하고 있는지, 왜 그런지 알고있는 희귀 한 경우에는 유용 ​​할 수있는 모든 종류의 위험한 도구와 마찬가지로 exec을 사용하거나 (또는 ​​잘못 사용하여) 당신의 변덕에 서 : 파이썬은 당신의 길에 서 있지 않습니다! -)

+0

이것은 실제로 사용되는 파이썬 버전에 의존하는 해킹처럼 보입니다. 이것이 계속 작동 할 것이라는 보장이 있습니까? – Johan

+0

호환되는 Python (1. * 또는) 2. 구현에서 작동해야합니다. 파이썬 3을 작성하는 요점은 우리가 역 호환성을 그런 식으로 깨뜨릴 수 있기 때문입니다. 그렇지만'print goo '조차도 Python 3에서는 작동하지 않습니다 ('print (goo)'). 그래서'exec' 문법과 의미 체계가 비슷하게 약화되는 것이 비교에서 중요한 문제는 아닙니다. –

+0

왜'exec'에 맨손으로 문자열이 전송 되었습니까? – Geo

0
print size 

코드가 컴파일 될 때 "크기"를 알 수 없으므로 작동하지 않습니다.

def a(dict): 
    locals().update(dict) 
    print locals()["size"] 

def b(): 
    size = 20 
    a(locals()) 

을하지만, 질문에 대한 주석으로 이미 제안 : 귀하의 코드는 다음과 같이 변경하면 작동이 매우 이상한 코드입니다. 나는 당신이 정말로하고 싶은 것을 설명하면 더 좋은 해결책이 있다는 것을 확신합니다.

1

어떻게 든 도움이됩니까?

def print_size(size=None): 
    print(size) 

dict = {'size': 'XXL'} 
print_size(**dict) 
1

를 다른 기능의 범위를 액세스하는 클로저를 사용할 수

def b(): 

    def a(): 
    print size 

    size = 20 
    a() 

트릭 서로 함께 속하는 기능을 적층하는 것이다. 이렇게하면 내부 함수 a가 외부 함수의 로컬 변수에 액세스 할 수 있습니다. b.

그러나 나는 당신이 실제로 무엇인지 알지 못해서 이것이 도움이되는지 확신 할 수 없습니다.

0

저는 알고 있습니다. 질문은 오래되었고 받아 들여진 대답은 이미 훌륭합니다.

명확하지만 언급되지 않았기 때문에 단지 2 센트를 추가하십시오. 명시 적으로 (기본값) 값을 할당하여 크기를 로컬로 만듭니다.

def a(dict): 
    size = 20 # size default value <- quick (and dirty?) fix 
    locals().update(dict) 
    print (size) 

def b(): 
    size = 20 
    a(locals()) 

따라서, A의 첨가 라인 (size = 20)는()의 크기는, exec 위해 필요 호환 최적화 단점없이 python3을받지 않고 실제의 로컬 변수가 될 수있다.

어떻게 유용 할 수 있습니까 ??? 그 python2에 구문 오류가 발생하지만, 단지 python3에서 작동하기 때문에

글쎄, 그와 함께 우리는 python2에서 def f(x, *args, y=10) 같은 것을 구현할 수 있습니다

def f(x, *args, **kwargs): 
    y = 10 
    locals().update(kwargs) 
    print (x, y) 

python2 및 python3의 작품 위의 예를 무엇

관련 문제