هل يجب أن أتسبب في خطأ ValueError في بايثون؟
سؤال
لدي هذا الرمز:
chars = #some list
try:
indx = chars.index(chars)
except ValueError:
#doSomething
else:
#doSomethingElse
أريد أن أكون قادرًا على القيام بذلك لأنني لا أحب التسبب في الاستثناءات عمدًا:
chars = #some list
indx = chars.index(chars)
if indx == -1:
#doSomething
else:
#doSomethingElse
هل هناك طريقة يمكنني من خلالها القيام بذلك؟
المحلول
لاحظ أن النهج الأخير يتعارض مع فلسفة "البيثونية" المقبولة عمومًا EAFP، أو "من الأسهل طلب المغفرة من الإذن"., بينما الأول يتبعه.
نصائح أخرى
if element in mylist:
index = mylist.index(element)
# ... do something
else:
# ... do something else
بالنسبة للحالة المحددة التي تكون فيها قائمتك عبارة عن سلسلة من سلاسل مكونة من حرف واحد، يمكنك الحصول على ما تريد عن طريق تغيير القائمة التي سيتم البحث فيها إلى سلسلة مسبقًا (على سبيل المثال.''.الانضمام (الحرف)).
يمكنك بعد ذلك استخدام طريقة .find()، والتي تعمل كما تريد.ومع ذلك، لا توجد طريقة مقابلة للقوائم أو المجموعات.
هناك خيار آخر محتمل وهو استخدام القاموس بدلاً من ذلك.على سبيل المثال.
d = dict((x, loc) for (loc,x) in enumerate(chars))
...
index = d.get(chars_to_find, -1) # Second argument is default if not found.
قد يكون أداء هذا أيضًا أفضل إذا كنت تجري الكثير من عمليات البحث في القائمة.إذا كان مجرد بحث واحد في قائمة المهملات، فلا يستحق القيام به.