2013-01-14 6 views
0

많은 필드가 빈 배열로 들어있는 객체가 있습니다 (모두 float64 유형 임). 이러한 필드 중 일부는 내가/접근 기록 할 때 사용하고자하는 의미있는 이름을 가지고 있지만, 내 현재의 지식으로, 나는 액세스하고 다음과 같이 작성해야합니다 : 나는 C에서 일하는 경우배열의 이름을 파이썬 변수에 대한 액세스/쓰기로 변경하는 방법은 무엇입니까?

//access: 
value = data[0] 
//write: 
data[0] = value 

것은, 내가 할 것 다음과 같은 내용 :

#define fieldname data[0] 
//access: 
value = fieldname 
//write: 
fieldname = value 

어떻게하면 파이썬에서 깨끗하게 처리 할 수 ​​있습니까?

EDIT : 이러한 필드는 모두 numpy 행렬 연산을 사용하여 선형 변환으로 업데이트되므로 numpy 배열에 있어야합니다.

편집 : 나는이 방법을 쓸 경우

def fieldname(self): 
    return self.data[0] 

내 접근이 원하는대로 보이는,하지만 같은 방식으로 다시 데이터를 기록 할 수 없습니다.

//access: 
value = self.fieldname 

(I 객체의 외부 상황에 일반화 문제를 느꼈기 때문에 자신이 전에 코드에서 생략되었다.)

내가 원하는에 가까운 수 있습니다 대입 연산자를 오버로드에 대한이 게시물 : How to Emulate Assignment Operator Overloading in Python?

해결 방법 : 필드 이름을 사용하고 self.data에 필요한 작업을 수행하는 방법을 __getattr____setattr__으로 작성하십시오. 제공된 필드 이름이 data가 아닌 다른 속성의 필드 이름과 일치 할 때 호출되지 않으며 이러한 특수 속성의 이름이 제공 될 때 데이터에서 항목을 가져 오는 기능을 추가합니다.

+0

이 방법이 효과가 있는지 알려주는 데 필요한 컨텍스트가 충분하지 않지만 NamedTuple 클래스를 살펴보아야합니다. http://docs.python.org/2/library/collections.html#namedtuple-factory-function-for-tuples- with-named-fields –

+0

파이썬이 참조를 사용하기 때문에 정확히 동일하지는 않습니다.이 경우에는 불변 객체입니다. 'data [0]'의 값이'value'의 값을 변경하면 변경되지 않습니다. 그것은 처음 언급되었을 때의 내용이 될 것입니다. – Keith

답변

1

게시 한 첫 번째 방법은 깨끗하고 분명하게 나에게 분명합니다.

value = data[0] 

data[0] = value 

각각

value = data.__getitem__(0) 

data.__setitem__(0, value) 

단지 문법 설탕 있음을 ​​알아 두셔야합니다.

행 액세스를 더 명확하게 만들고 싶다면 다른 필드 이름에 대한 상수 정의를 고려하십시오.

FIELDNAME1, FIELDNAME2, FIELDNAME3 = range(3) 

data[FIELDNAME1] = value 

value = data[FIELDNAME2] 
+0

괜찮습니다. 많은 필드가 있기 때문에 액세스 할 때 필드 이름을 사용해야하며 각 필드가 어느 번호인지 기억하기 어렵습니다. – user1123936

+0

나는 "괜찮아"라고 말하면 안됩니다. 적어도 읽을 수는 있습니다. – user1123936

+0

@ user1123936 : 사실, 파이썬은 포인터 연산을하지 않습니다. 거꾸로 (비 유적으로) 구부릴 수 있고 포인터처럼 작동하는 무언가를 쓸 수도 있지만 위와 같이 키/인덱스를 사용하여 값을 액세스하는 것보다 훨씬 혼란 스럽다. 이에 해당하는 파이썬 관용구는 다음과 같습니다. "한 가지가 있어야하며 가능하면 한 가지 방법 밖에 없습니다." –

1

모든 필드에 대한 설명이 있으면 열거 형과 유사한 작업을 수행 할 수 있습니다.파이썬은 열거되어 있지 않지만, 여기에 설명과 같습니다 비슷한 일을하는 여러 가지 방법이있다 : 예를 들어 How can I represent an 'Enum' in Python?

, 그리고 일반적인 열거 논쟁의 위험에, 당신은 같은 것을 할 수있는 :

def enum(**enums): 
    return type('Enum',(), enums) 

Numbers = enum(ONE=1, TWO=2, THREE='three') 
print Numbers.ONE 
print Numbers.TWO 
print Numbers.THREE 
+0

이것을 사용하면 내 액세스가 다음과 같이 보일 것입니다 : 'value = data [Numbers.FIELDNAME]', 이는 Joel Cornett의 솔루션에서 'value = data [FIELDNAME]'만큼 좋지 않습니다. – user1123936

+0

@ user1123936 : 실제로 네임 스페이스 혼란을 줄이기 때문에이 방법을 선호합니다. –

+0

사실 나는'data.ONE','data.TWO' 등을 의미했습니다.하지만 당신과 조엘 코넷은 맞습니다. 제안을 철회합니다. –

관련 문제