سؤال

كيف يتم تنفيذ هذا في بيثون المستوى ؟

لدي كائن أن تتظاهر بأنها ديكت بالنسبة للجزء الأكبر (في وقت لاحق يجب أن يكون فقط ثم subclassed dict, ولكن أنا أفضل أن لا ريفاكتور تعليمات البرمجة الأساسية, و أود أيضا أن أعرف هذا كمرجع في المستقبل) ، والتي تبدو شيئا مثل

class configThinger(object):
    _config = {}
    def __getitem__(self, key):
        return self._config[key]
    def __setitem__(self, key, value):
        self._config[key] = value

وهو يعمل تماما كما أنه من المفترض أن يتصرف بشكل صحيح عند محاولة الوصول إنها عناصر configThingerInstance['مهما']

ولكن مكالمة مثل

t = configThinger()
t.populate() # Internal method that fills it with some useful data
if 'DEBUG' in t:
    doStuff()

النتائج في KeyError تثار بسبب ويفترض `في' البروتوكول لا getitem() البحث عن المفتاح في السؤال.هل أنا بحاجة إلى رفع بعض الاستثناءات الأخرى أن أقول أنه ليس هناك ؟ أنا أفضل أن لا أفعل شيئا من هذا القبيل.

try:
    t['DEBUG']
except KeyError:
    pass
else:
    doStuff()

أيضا ، حيث في وثائق هذا ؟

كنت أبحث في جميع أنحاء

http://docs.python.org/tutorial/datastructures.html

http://docs.python.org/library/stdtypes.html

ولكن بشكل مأساوي تحاول البحث عن شيء محدد لكلمة 'في' هو حماقة :(

تعديل 1:

مع كومة من تتبع بصمات أستطيع أن أرى أن برنامج المكالمات configThingerInstance.getitem(0)

ومع ذلك

t = {'rawk': 1,
     'rawr': 2,
    }
t[0] # Raises KeyError
'thing' in t # returns False
هل كانت مفيدة؟

المحلول

يبدو أنك تريد أن تفرط في المشغل ؟

يمكنك القيام بذلك عن طريق تحديد الأسلوب __contains__: http://docs.python.org/reference/datamodel.html#object.يحتوي على

نصائح أخرى

للحصول على أفضل دعم in مشغل (الاحتواء الملقب عضوية التحقق), تنفيذ __contains__ خاصة الطريقة على الخاص configThinger الدرجة:

class configThinger(object):
    _config = {}
    def __getitem__(self, key):
        return self._config[key]
    def __setitem__(self, key, value):
        self._config[key] = value
    def __contains__(self, key):
        return key in self._config

المستندات هي هنا (أيضا شرح الأخرى, أقل سبل دعم in المشغل).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top