2015-01-12 2 views
0

나는 어떤 데이터가 객체 Foo()에 저장되어 있습니다.파이썬에서 새로운 함수의 자동 정의

Foo.data은 n x m np.array의 목록입니다. 각 배열은 특정 시간에 실험 데이터를 나타냅니다. 배열은 m 개의 변수로 구성되며, n은 측정이 수행 된 다른 점의 수와 일치합니다.

우리는 우리가 우리의 처분에 변수 이름의 목록, 예를 들어 가지고 고려할 수 :

def Foo.P(self,x,time) 
    index_t=time_list.index(time) 
    index_x=var_names.index(x) 
    index_P=var_names.index(P) 
    return Foo.data[index_t][index_x,index_P] 

질문 : 내가 좋아하는 뭔가를 정의하는 데이터를보다 쉽게 ​​액세스 할 수 있도록하기 위해 좋아합니다

var_names=['x','volume','u','L_bar','rho','P',.....] 

을 : 변수 목록이 고정되어 있지 않지만 변수가 다를 수 있다는 점을 감안할 때, 각 변수에 대해 명시 적으로 정의하지 않고 이전에 표시 한 일부 기능을 자동으로 정의 할 수 있습니까?

내 말은, Foo.P, Foo.volume, Foo.u, Foo.rho와 같이 함수 이름으로 주어진 변수의 값을 추출하는 것과 같은 많은 함수를 갖고 싶습니다. x, 시간) 위치를 지정합니다.

+0

당신은'getattr를 사용할 수 있습니다)': http://stackoverflow.com/q/4075190/882697 – Plouff

+0

['namedtuple'] (https://docs.python.org/2/library/collections.html#collections.namedtuple)을보십시오. –

+0

나의 대답이 도움이된다면 그것을 받아들이는 것을 잊지 마십시오. :) –

답변

1

왜 이름을 전달하지 않습니까? 이처럼 :

#!/usr/bin/python 
# -*- coding: utf-8 -*- 


var_names=['x','volume','u','L_bar','rho','P'] 

def general_foo(self, name, x, time) 
    index_t=time_list.index(time) 
    index_x=var_names.index(x) 
    index_P=var_names.index(name) 
    return Foo.data[index_t][index_x,index_P] 

for var in var_names: 
    general_foo(var, x, time) 
+0

그래, 그게 내 초기 아이디어지만, 뭔가 "찾고 더 나은"(즉, 직접 변수 이름으로 전화), 그리고 질문이 나에게 흥미로 보였다. – Pierpaolo

+0

@ thunder1123 그러면 람다와 getattr을 사용해야 할 것입니다. 그러나 내 관점에서 볼 때, 그들은 동일합니다. 람다 부분은 일반적인 부분입니다. 한편, 람다 (lambda)는 그렇게 쉽게 읽을 수없는 코드를 만듭니다. –

2

당신은 다음과 같이 Foo에 특별한 __getattr__ 방법을 정의하여이를 수행 할 수 있습니다 (

def __getattr__(self, name): 
    """If name is known, return a function to get that data for given (x, time).""" 
    if name not in var_names: # name not known 
     raise AttributeError 
    return lambda x, time: self.data[time_list.index(time)][var_names.index(x), var_names.index(name)] 
+0

왜 람다를 사용 했습니까? – Pierpaolo

+0

음,이 함수는 함수를 반환해야하므로 람다는 자연스럽게 보였습니다. 물론 하나 이상의 방법이 있습니다. –

+0

Foo.P (x, time)와 같은 호출을 지원하는 함수를 어떻게 수정할 수 있습니까? 왜냐하면 지금은 효과가 없기 때문입니다. – Pierpaolo

관련 문제