في البروتوكول فيما يتعلق تسلسل
سؤال
كيف يتم تنفيذ هذا في بيثون المستوى ؟
لدي كائن أن تتظاهر بأنها ديكت بالنسبة للجزء الأكبر (في وقت لاحق يجب أن يكون فقط ثم 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
المشغل).