2010-06-08 3 views
0

처음 몇 가지 배경. 간단한 파일 형식을 파싱하고 나중에 파이썬 코드에서 결과를 다시 사용하고자하므로 매우 간단한 클래스 계층 구조를 만들고 파서를 사용하여 원본 파일의 원본 레코드에서 개체를 생성했습니다. .python 2.6에서 여러 인스턴스 속성을 인쇄하는 우아한 방법은 무엇입니까?

동시에 데이터를 레거시 데이터베이스에로드하려는 경우 로더 파일은 간단한 탭 구분 형식을 사용합니다. 나는 그것을 좀 더 쉽게 무엇을 무엇을 볼 수 있도록하기 위해 Template 클래스를 사용하는 거라고 생각하지만 인쇄 너무 많은 열이 있기 때문에

print "{0}\t{1}\t....".format(record.id, record.attr1, len(record.attr1), ...) 

: 가장 간단한 방법은 그런 짓을하는 것입니다 예 :

templ = Template("$id\t$attr1\t$attr1_len\t...") 

그리고 난 그냥 파생 된 값에 대한 몇 가지 추가 키워드로하는 substitute 호출에 의해 사용되는지도의 장소에서 기록을 사용할 수 있습니다 생각 :

print templ.substitute(record, attr1_len=len(record.attr1), ...) 

불행하게도 이것은 실패합니다. 레코드 인스턴스에는 __getitem__ 속성이 없습니다.

그래서 제 질문은 두 가지이다 :

  • 내가 __getitem__를 구현해야하는 방법 그렇다면 어떻게?
  • 거기에 당신이 이미 이름을 알고있는 많은 속성을 출력해야하는 곳을위한 더 우아한 방법이 있습니까? 당신이 ATTR1의 길이 레코드 클래스의 속성이나 특성을 한 경우

답변

2
class MyRecord: 
    #.... 
    def __getitem__(self, key): 
     return getattr(self, key) 
+0

감사! 'AttributeError's를'KeyError's로 바꾸기 위해 try-except를 추가했습니다. – wds

2

(그래서 당신은 정말 그냥 제목에서 알 수 있듯이 인스턴스 속성을 인쇄하고), 당신은이 작업을 수행 할 수 있습니다.

attrs = ['id', 'attr1', 'attr1_len', ...] 
print '\t'.join(getattr(record, attr) for attr in attrs) 
+0

매우 깨끗합니다. 불행히도 여기저기서 파생 된 속성을 실제로 피할 수는 없습니다 (객체에 모두 추가 할 수는 있지만 이중 작업처럼 보이고 네임 스페이스를 망가 뜨리는 것 같습니다). – wds

+0

파생 된 속성은 정확히 어떤 속성이 좋은지, 그러나 당신의 질문에서 얼마나 많은 것이 필요한지, 아니면 단지 len인지 또는 무엇인지 알 수는 없습니다. – FogleBird

+0

일부 출력 형식이 여기 저기에 (쉼표로 구분 된 값으로 목록이 축소되는 등) 복제가 불가능합니다. 어쨌든 피할 수 없다면. +1, 그런 질문에 대한 몇 가지 세부적인 문제가없는 경우 질문에 대한 최선의 답변입니다. – wds

관련 문제