문제

locals 내장되어 반환하는 함수의 사전 지역의 값입니다.문서를 말한다:

경고

의 내용이 사전야 되지 않을 수정이 변경될 수 있습지 에 영향을 미치 값의 지역 변수 사용에 의하여 인터프리터입니다.

불행하게도,exec 같은 문제에서는 파이썬 3.0.방법은 없 라운드 이?

활용 사례

생각해 보십시오:

@depends("a", "b", "c", "d", "e", "f")
def test():
    put_into_locals(test.dependencies)

따라 저장한 문자열에서 제공하는 인수에 목록 test.dependences.이 문자열은 키에는 사전 d.고 싶을 할 수 있을 쓸 수 put_into_locals 그래서 우리는 우리를 떼어낼 수 있는 값의 d 고 그들을 넣어합니다.이것이 가능한가요?

도움이 되었습니까?

해결책

나는 그냥 테스트 exec 고 그것은 작품에서는 파이썬 2.6.2

>>> def test():
...     exec "a = 5"
...     print a
...
>>> test()
5

를 사용하는 경우 Python3.x,그것은 더 이상 작동하지 않기 때문에 주민들은 최적화된 배열로 런타임 시에 사용하는 대신에 대한 사전입니다.

When Python 감"exec 문",그것은 강제 Python 스위치 로컬 저장소에서 배열을 사전입니다.그러나 그 이후"exec"함수에서 Python3.x,컴파일러를 만들 수 없습이 구별이 때문에 사용자가 무엇이든 할 수 있었을 거야"같은 exec=123".

http://bugs.python.org/issue4831

을 수정할 수는 지역 주민의 기능에 대 비행하지 않고 할 수 없 여러 가지 결과가:일반적으로, 기능이 지역 주민들에 저장되지 않은 사전지 배열의 수는 컴파일 시간에 결정 에서 알려진 곳입니다.이 충돌 적어도 새로운 지역 주민에 의해 추가 exec.이전 exec 문의 피이기 때문에, 컴파일러 알고 있는 경우 exec 없이 globals/지역 주민 args 에서 발생했습니다 기능,그 네임스페이스의 것 "최적화되지 않은"즉을 사용하지 않는 지역 주민들의 배열입니다.이후 exec()은 지금 정상기능을 컴파일러하지 않습 알"exec"수밖에 없고, 지 않을 수 있으므로 치료하는 것입니다.

다른 팁

로컬 변수는 할당 문으로 수정됩니다.

문자열 인 사전 키가 있다면 로컬 변수를 만들지 마십시오. 사전 키로 사용하십시오.

당신이 절대적으로 ~ 해야 하다 로컬 변수 가이 작업을 수행하도록하십시오.

def aFunction( a, b, c, d, e, f ):
    # use a, b, c, d, e and f as local variables

aFunction( **someDictWithKeys_a_b_c_d_e_f )

마법 같은 일을하지 않고 사전에서 일부 로컬 변수가 채워집니다.

이것은 불가능합니다. 나는 이것이 나중에 성능 최적화를 허용하는 것이라고 생각합니다. Python Bytecode 참조 이름이 아니라 인덱스별로 현지인; 현지인 ()가 쓸 수 있어야한다면 통역사가 일부 최적화를 구현하지 못하거나 더 어려워 질 수 있습니다.

API가 할 수 있다면 Locals () 가이 제한을 가지지 않기 때문에 이와 같은 현지인을 편집 할 수있는 핵심 API를 찾지 못할 것입니다.

모든 현지인들은 컴파일 타임에 존재해야한다는 것을 잊지 마십시오. 컴파일 타임에 로컬에 바인딩되지 않은 이름을 참조하면 컴파일러는 글로벌이라고 가정합니다. 편집 후 로컬을 "생성"할 수 없습니다.

보다 이 질문 하나의 가능한 솔루션은 심각한 해킹이며 실제로 그렇게하고 싶지 않습니다.

예제 코드에는 기본적인 문제가 있습니다.

@depends("a", "b", "c", "d", "e", "f")
def test():
    put_into_locals(test.dependencies)

"test.dependencies" "f.dependencies"를 언급하지 않는 것이 없다. 여기서 f는 현재 함수이다. 실제 글로벌 가치 "테스트"를 참조하고 있습니다. 즉, 두 개 이상의 데코레이터를 사용하는 경우 :

@memoize
@depends("a", "b", "c", "d", "e", "f")
def test():
    put_into_locals(test.dependencies)

"테스트"가 Memoize의 랩핑 된 함수이기 때문에 더 이상 작동하지 않습니다. 파이썬 진짜 "현재 실행하는 함수"(및 클래스)를 참조하는 방법이 필요합니다.

나는 그것을 변수로 보관할 것입니다 :

refs    = locals()
def set_pets():
    global refs
    animals = ('dog', 'cat', 'fish', 'fox', 'monkey')
    for i in range(len(animals)):
        refs['pet_0%s' % i] = animals[i]

set_pets()
refs['pet_05']='bird'
print(pet_00, pet_02, pet_04, pet_01, pet_03, pet_05 )
>> dog fish monkey cat fox bird

그리고 현지인에 넣기 전에 DITT를 테스트하고 싶다면 () :

def set_pets():
    global refs
    sandbox = {}
    animals = ('dog', 'cat', 'fish', 'fox', 'monkey')
    for i in range(len(animals)):
        sandbox['pet_0%s' % i] = animals[i]
    # Test sandboxed dict here
    refs.update( sandbox )

Macos Sierra의 Python 3.6.1

동일한 제한이 적용되는지 확실하지 않지만 검사 모듈을 통해 현재 프레임 (및 로컬 변수 사전)을 직접 참조 할 수 있습니다.

>>> import inspect
>>> inspect.currentframe().f_locals['foo'] = 'bar'
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'foo', 'inspect']
>>> foo
'bar'
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top