그것은 못생긴 것이 아닙니다. 점 표기법은 '다른 사용자 정의 클래스'객체의 일부 사용자 정의 클래스가 있음을 의미합니다. 더 실현 가능한 방법은 사전 (괄호 표기법 사용)을 사용하는 것입니다.
그러나 당신이 주장하는 경우, 당신은 아마 그런 식으로 코드 변환 할 수 있습니다 :
>>> c1 = {
'conf1': {
'key1': 'aaa',
'key2': 12321,
'key3': False,
},
'conf2': 'bbbb',
}
>>> c1
{'conf2': 'bbbb', 'conf1': {'key3': False, 'key2': 12321, 'key1': 'aaa'}}
>>> c2 = config2object(c1)
>>> c2.conf1
{'key3': False, 'key2': 12321, 'key1': 'aaa'}
>>> c2.conf1.key1
'aaa'
>>> c2.conf1.key3
False
>>> c2.conf2
'bbbb'
편집 : 스벤 Marnach이 Config('config.ini')
가 주목
def config2object(config):
"""
Convert dictionary into instance allowing access to dictionary keys using
dot notation (attributes).
"""
class ConfigObject(dict):
"""
Represents configuration options' group, works like a dict
"""
def __init__(self, *args, **kwargs):
dict.__init__(self, *args, **kwargs)
def __getattr__(self, name):
return self[name]
def __setattr__(self, name, val):
self[name] = val
if isinstance(config, dict):
result = ConfigObject()
for key in config:
result[key] = config2object(config[key])
return result
else:
return config
그리고 테스트가 예상 결과를 보여를 일부 사용자 정의 클래스 인스턴스. 사전이 아니기 때문에 매우 유용 할 수있는 몇 가지 사용자 지정 메서드가 있지만 이름 충돌이있는 경우 일부 구성 옵션을 액세스 할 수 없게 만들 수 있습니다. 따라서 선호하는 방법은 앞서 언급 한 솔루션을 사용하는 것이 아니라 구성 옵션에 액세스 할 때 괄호 표기법을 사용하는 것입니다.
어떻게 당신이'ConfigParser'의 모든 일반적인 특성을 액세스 할 것인가? 'options','read','get','write'와 같은 이름을 가진 꽤 많은 것들이 있습니다. 이러한 속성들의 네임 스페이스를 설정 파일의 네임 스페이스와 혼합하는 것은 나쁜 생각입니다. 어쨌든이 작업을 수행하고 충돌을 해결하려는 방법을 자세히 확인하면 작업 수행 방법을 알려줄 수도 있습니다. 그리 어렵지는 않습니다. 단지 나쁜 생각 일뿐입니다. –
[변수 이름에서 데이터를 지키십시오.] (http://nedbatchelder.com/blog/201112/keep_data_out_of_your_variable_names.html) – katrielalex
@SvenMarnach : 당신은 속성에 대해 완전히 정확합니다. 나는 그들을 잊어 버리고 해결책을 게시했습니다. 따라서 문제는 속성을 사용하여 액세스 할 수없는 일부 구성 옵션을 만들 수있는 가능한 이름 충돌이기도합니다. – Tadeck