2013-09-05 2 views
2

추가 처리를 위해 사용자 정의 함수에 정보를로드하려고합니다. 입력 파일은 프로그래머가 아닌 사람에 의해 생성해야하기 때문에 나는 다음과 같은 형식을 선택했습니다 :execfile()을 사용하여 함수 변수 설정

#contents of vessel_data.txt 
hull_length = 100000. 
hull_width = 50000. 
etc. 

내 함수는 execfile()를 통해 입력 파일을로드합니다. 그런 다음 데이터를 배열로 그룹화하고이를 함수의 출력으로 전달하려고합니다. 대략과 같이 :

file_path = ..\vessel_name.txt 

def my_input_func(file_path): 
    execfile(file_path) 

    data = np.array([[hull_length], 
        [hull_width ], 
        [etc.  ]]) 

    return(data) 

나는 exec()execfile()를 통해 그 데이터를로드 눈살을 찌푸리게 알고 있지만, 입력은 비 프로그래머 명심 생성됩니다. 어쨌든, 나는 다음과 같은 오류 얻을 :이 줄을 추가 한 후

NameError: global name 'hull_length' is not defined 

을, 나는 예상대로 내 변수는 local 이름 공간에로드되는 것을 확인할 수 있습니다

print 'Locals: ' + str([x for x in locals() if x[0] == 'h']) 
print 'Globals: ' + str([x for x in globals() if x[0] == 'h']) 

을 나 한테 무슨 퍼즐 것은 왜 내 기능입니다 변수를 정의하려고 할 때 global 이름 공간을 찾습니다. 필자는 명시 적으로 언급하지 않는 한 함수 내부의 모든 것이 함수의 로컬 인 이름 공간을 처리한다는 인상하에있었습니다. 나는 내 execfile() 명령을 수정하여 작동 할 수 있습니다 :

execfile(file_path, globals()) 

하지만 난 전역 이름 공간으로 모든로드에 관심이 아니다.

그렇다면 global 네임 스페이스에 모든 것을로드하지 않고이 작업을 수행하려면 어떻게해야합니까?

file_path = ..\vessel_name.txt 

def my_input_func(file_path): 
    vessel_vars = {} 
    execfile(file_path, vessel_vars) 

    data = np.array([[vessel_vars['hull_length']], 
        [vessel_vars['hull_width'] ], 
        [vessel_vars['etc.']  ]]) 

    return(data) 
:

종류와 관련, 라스무스

======== 편집 =======는

이 나는 ​​그것이 쿠엔틴의 답변에 따라 작동하게하는 방법이다

환호성 Quentin!

+0

이것은 컴파일 타임에 컴파일러가 변수의 로컬 정의를 보지 못해서 로컬로드가 아닌 전역로드로 액세스를 컴파일한다는 사실 때문이라고 생각합니다. – Hyperboreus

+0

[docs] (http://docs.python.org/2/library/functions.html#execfile)에서는 로컬 또는 글로벌 사전을 지정해야한다고 언급하지만 그렇지 않으면'execfile '이 반환되지 않습니다. – Greg

답변

4

docs for execfile() 함수에 대한 로컬 변수 수정을 경고합니다. 불가능합니다!

The default locals act as described for function locals() below: modifications to the default locals dictionary should not be attempted. Pass an explicit locals dictionary if you need to see effects of the code on locals after function execfile() returns. execfile() cannot be used reliably to modify a function’s locals.

이 execfile에 대해 아니에요()하지만 지역 주민에 대한() : 또한 NameError: global name 'a' is not defined을 얻을 것이다

def f(): 
    locals()['a'] = 3 
    print(a) 

. 이것은 아마도 최적화 목적 일 수 있습니다.

file_path = os.path.join('..', 'vessel_name.txt') 

def my_input_func(file_path): 
    vessel = {} 
    execfile(file_path, vessel) 

    data = np.array([[vessel['hull_length']], 
        [vessel['hull_width'], 
        [vessel['etc.']]) 

    return(data) 

참고 : 여기에이 솔루션은 사전을 사용하는 것입니다 지금은 간부이다) 그 execfile (를 제외하고, 파이썬이 사용하고 있지만, 파이썬 3에서 같은 될 것이라고 있으리라 믿고있어() 및 직접 파일을 열어야합니다.