2012-05-21 2 views
0

내가 설명한 here과 같은 자바 스크립트 스타일 사전을 사용하고 있습니다. 구현 :파이썬 점 표기법 dict이 하이픈으로 분리됩니까?

class DotDict(dict): 
    def __getattr__(self, attr): 
     return self.get(attr, None) 
    __setattr__= dict.__setitem__ 
    __delattr__= dict.__delitem__ 

나는 문제없이 몇 시간 동안이 구조를 사용하지만, 최근과 같이 하이픈 키를 사용하여 사전을 필요로했습니다

foo = DotDict() 
    foo.a = 'a'  #Business as usual 
    foo.a-b = 'ab'  #Broken 

에 결과를 foo.ab에 할당 :

SyntaxError: can't assign to operator 

'-'가 빼기 작업으로 표시되고 키 이름의 일부로 표시되지 않기 때문에 깨집니다. 도트 스타일의 멤버 액세스로 사전을 만드는 또 다른 방법이 있습니까?

+1

,하지만 당신은 그것을 할 싶지 않아, 사람들은 당신의 코드를 읽을 것이다 : 당신은 밑줄 하이픈을 교체한다면, 코드가 작동합니다 네가 그렇게하지 않기를 바란다. (물론 dot 스타일의 멤버 액세스 권한을 얻지 못할 것입니다.) – zmo

+0

-1 이것 역시 유효한 injavascript가 아닙니다. – jsbueno

답변

5

a-b은 파이썬에서 유효한 식별자가 아닙니다. 유효한 식별자는 문자, 숫자 및 밑줄로 구성 될 수 있습니다 (_). 다른 모든 문자는 변수 이름에서 유효하지 않습니다.

Is there another way to create a dictionary with dot-style member access?

유효한 식별자하지 않은 키 도트 스타일의 액세스를 갖는 방법없습니다.

+0

Python의 인터프리터는'((foo.a) - (b)) = ('ab')'로 불리며 표현식이 좌변표가 될 수 없기 때문에 불법입니다. – zmo

1

글쎄, 그렇게 할 수는 있지만 실제로 그렇게하고 싶지는 않습니다.

>>> class foo(): 
... pass 
... 
>>> f = foo() 
>>> setattr(f, 'foo-bar', 1) 
>>> getattr(f, 'foo-bar') 
1 
1

직접적인 방법으로는 불가능합니다. 가장 좋은 방법은 혼합 액세스를 허용하는 것입니다 - 이미 수행 한 것처럼 -이를 사용하십시오. 또는 setattr()/getattr()Not_a_Golfer suggests으로 사용하십시오.

1

a-b은 유효한 식별자가 아니며 연산자 -을 사용하는 표현식으로 해석됩니다. 그런 필드를 설정할 수 있습니다. setattr(foo, 'a-b', 'ab')

3

놀랄 이유가 확실하지 않습니다. 자바 스크립트에서 같은 표현도 오류가 발생합니다 : 그냥 자바 스크립트로

>>> foo.a-b = 'ab' 
ReferenceError: invalid assignment left-hand side 

그래서를, 다시 가을 :

>>> foo['a-b'] = 'ab' 
0

그것은, 당신이 달성하려고하는 관용구에 맞지 않을 수 있지만, 그것이 않은 setattr/getattr 해킹 함께 할 수있어

foo.a_b = 'ab' 
관련 문제