점선 이름이 객체에 적용되지 않는 getitem
묘사
getitem으로 대상을 정의하면 허선 이름 ({obj.attr}) 으로 템플릿의 변수를 인쇄할 수 없습니다.나는 이미 나에게 도움이 되는 해커 행위를 멈추었지만, 나는 정말 이 일을 어떻게 정확하게 해야 할지 모르겠다.
43 if isinstance(context, dict): 44 # Then we consider the argument a "hash" for the purposes of the spec. 45 # 46 # We do a membership test to avoid using exceptions for flow control 47 # (e.g. catching KeyError). 48 if key in context: 49 return context[key] 50 else: 51 try: 52 attr = context[key] 53 except AttributeError, e: 54 return _NOT_FOUND 55 except TypeError, e: 56 try: 57 attr = getattr(context, key) 58 except AttributeError, e: 59 return _NOT_FOUND 60 if callable(attr): 61 return attr() 62 return attr 63 return _NOT_FOUND
토론 #1
Hi @x86-64 and thanks for the report. The beginning of this page from the Mustache spec would be good to review for discussion purposes.
A couple questions:
Would you prefer that your object be interpreted as a hash or as an object for the purposes of the spec? In particular, are all of your object's context attributes accessed via __getitem__
or are some of them accessed as methods/attributes, too?
Strictly speaking, the spec says that the value of an attribute for an object is "the value returned by the method with the given name," which is different from calling __getitem__
in Python-land. Would you consider implementing __getattr__
for your objects (or perhaps __getattribute__
) -- and having that method call __getitem__
? It seems like that might work to solve your problem in a way that's unambiguously consistent with the spec.
토론 #2
All attributes that i access from mustache template is processed by
__getitem__
. Well, i could add those methods for each attribute, but
this is what i was trying to avoid by using getitem in first place.
Isn't getitem could be considered as special catch-all attribute?
Because obj["attr"] in python works, and i was expecting that
{{obj.attr}} would work too, despite on how it was implemented. Maybe i
missing something here.
토론 #셋
I wasn't suggesting adding those methods for each attribute. I was suggesting doing this, for example (using __getattr__
instead of or in addition to __getitem__
):
class MyClass(object):
def __init__(self, data):
self.data = data
def __getitem__(self, key):
return self.data[key]
def __getattr__(self, name):
return self.__getitem__(name) # or alternatively, return self.data[key]
foo = MyClass({'bar': 'baz'})
# Now these both work
print foo['bar']
print foo.bar
이것은 너에게 쓸모가 있니?토론 #4
아, 테스트를 해 봤는데 실패했어요. 그리고 다른 방법을 사용했어요.(내 예에서 이것은'user'클래스이다. 여기서 나는 몇 가지 통용 함수를 가지고 있다. 예를 들어
save (),load () 및 기타 속성은 사용자의 매개 변수입니다.그래서 제가 필요해요.
getattr의 목록에 내 매개 변수를 추가하거나
방법이것은 옳은 것입니까, 아니면 다른 방법이 있습니까?
어쨌든, 나는 이 사건이 아직 찾지 못했다는 것을 알아차렸다. 그래서 나는
이것은 큰 피해가 없을 것입니다. 검사와 '시도' 를 추가합니다.
토론 #5
'그런데 다른 방법이 없다'는 게 무슨 뜻인지 모르겠어요.위에서 링크한 Python 문서에서 말한 바와 같이__getattr__
"속성 검색이 일반적인 위치에서 속성을 찾지 못했을 때만 호출됩니다."이것은 __getattr__
이 이름을 가진 방법이나 속성을 처음으로 호출한 후에만 백업으로 호출된다는 것을 의미한다.다음은 몇 가지 예시 코드로 그것의 작업 원리를 설명한다.
https://gist.github.com/2977954
따라서
__getattr__
목록에 방법을 추가할 필요가 없습니다. 그러면 작업을 할 수 있습니다.토론 #6
아, 이건 어리석은 잘못이야. 나 "class User:"있어. "class"일 거야.사용자 (대상). 폐를 끼쳐서 죄송합니다. 이것을 닫을 수 있습니다. (도움말 감사합니다.
토론 #7
괜찮습니다. Pystache를 사용해 주셔서 감사합니다. 성공적으로 성공했습니다.토론 #8
미친 듯이 모델을class Model(object)
로 정의했습니다. class Model()
Pystache에서 속성에 접근할 수 있도록 허락했습니다. 토론 #9
거슬러 올라가기 (지난번 최신 호출):파일 "app.py", 9행,
api=TwitterClient('Afridi')
파일 "C:\Users\Aafaq Ahmad\Aafaq Sahib\twitter.py", 16번째 줄, init
소비자 키 = 운영 체제.환경 ['JQM5TMwSPV6fKHmfbSBNKgE2O']
파일 "C:\Users\Aafaq Ahmad\lib\os.py", 675 행, getitem
"없음"에서 열쇠 승급 오류(열쇠)
KeyError:'JQM5TMwSPV6fKHmfbSBNKgE2O'
이 문제 좀 해결해 주세요.
Reference
이 문제에 관하여(점선 이름이 객체에 적용되지 않는 getitem), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://github.com/defunkt/pystache/issues/123텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)