2010-04-11 6 views
2

설정 파일에서 읽기 네 줄은 반복적인데 어떻게 든 섹션의 각 항목에 대해 self.item 변수를 만드는 하나의 Pythonic 줄로 압축해야합니다.파이썬 내가 ConfigParser를 사용하여 설정 파일을 읽어 파이썬 클래스가

아이디어가 있으십니까?

아담

UPDATE : 귀하의 답변에 따라

, 나는 내 코드를 수정 한 : 지금

for item in config.items('geography'): 
     setattr(self, '_'+item[0], float(item[1])) 

print self.__dict__ 
    >>> {'_xmax': 18.600000000000001, '_ymax': 47.100000000000001, 
     '_ymin': 36.600000000000001, '_xmin': 6.5999999999999996} 
+0

누구나이 접근 방법으로 보안 취약점이 발생할 가능성이 있습니까? ''_dict __ = [<위험한 곳>]]'줄을 설정에 추가하는 악의 의도를 상상해보십시오. '__dict__'가 기회로 보호된다면 (실제로 시도하지는 않았습니다.) 간섭을받을 수있는 다른'__XXX__' 헬퍼가 많이 있습니다. 그래서 Rubayeet와 Michael의 답변은 '명백 함이 내재적 인 것보다 낫다'는 비범 한 원칙을 따르는 것보다 더 완벽합니다. –

답변

3
for line in ['x_min', 'x_max', 'y_min', 'y_max']: 

    setattr(self, line, config.getfloat('geography', line.replace('_', ''))) 
+0

+1 감사합니다. 내 질문에 수정 된 솔루션을 추가했습니다. –

1

어떻게 같은 약 :

 
for key in ['xmin','xmax','ymin','ymax']: 
    self.__dict__[key] = config.getfloat('geography',key); 

위의 내용은 self.x_min 대신 self.xmin에 할당된다는 것에주의하십시오. 그러나 이름 지정에 문제가 없다면이 작업이 가능합니다 ... 그렇지 않으면 이름 간의 매핑이 더 많습니다. 코드를 원본보다

5

나는 보통 생성자에서 외부 상호 작용을 피하려고 노력한다. 코드를 테스트하기가 어렵다. config 파서 인스턴스 나 파일 이름 대신 fp와 같은 객체를 전달하는 것이 좋습니다.

+0

정교하게 주시겠습니까? –

+3

+1 : 설정 읽기는 생성자의 일부가 아닙니다. 열려있는 파일을 메소드에 전달하십시오. 파일을 비밀리에 열지 마십시오. 열린 파일 객체를 메소드에 전달하면 비밀 파일에 의존하지 않는 단위 테스트를 쉽게 생성 할 수 있습니다. –

+0

그들은 당신의 클래스가's = Slicer (file); s.parse()'. 모든 설정을 구성하는 것과 반대입니다. init에서 많은 기능이 수행되는 경우 단위 테스트에서 개별 메소드와 기능을 테스트하기가 어려워집니다. –