점선 이름이 객체에 적용되지 않는 getitem

5076 단어 pystache

묘사

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'
이 문제 좀 해결해 주세요.

좋은 웹페이지 즐겨찾기