خطأ تأكيد Python ، تحويل السلسلة إلى int
سؤال
أحاول إعادة كتابة LIB المكتوبة في PHP في Python. إنه يتعامل مع جميع طلبات sphinx. في وظيفة init ، أحاول تعيين أوضاع البحث الافتراضية والمطابقة ، لكنني واجهت مشكلة صغيرة. أحصل على أوضاع من ملف التكوين.
في PHP ، تحتاج إلى استخدام ثابت كمدخل:
$this->sphinx->SetMatchMode(constant($this->conf['match_mode']));
سيؤدي ذلك إلى تحويل السلسلة من ملف التكوين إلى ثابت ويعمل كل شيء. يبدأ الجزء الصعب في بيثون ، عندما أحاول القيام بذلك:
self.sphinx.SetMatchMode(self.config['match_mode'])
انا حصلت:
AssertionError in
assert(mode in [SPH_MATCH_ALL, SPH_MATCH_ANY, SPH_MATCH_PHRASE, SPH_MATCH_BOOLEAN, SPH_MATCH_EXTENDED, SPH_MATCH_FULLSCAN, SPH_MATCH_EXTENDED2])
في هذه الحالة ، يجب أن يكون الإدخال عددًا صحيحًا ، لكن الإدخال عبارة عن سلسلة ولا يمكنني تحويلها لأنني أحصل على استثناء - السلسلة هي SPH_MATCH_ALL
.
invalid literal for int() with base 10: 'SPH_MATCH_ALL'
عندما أحاول هذا:
print type(self.config['match_mode']) # -- string
print type(SPH_MATCH_ALL) # -- integer
print SPH_MATCH_ALL # -- 1
print SPH_MATCH_ANY # -- 0
لذلك سيكون سؤالي ، كيف يمكنني تحويل السلسلة إلى عدد صحيح أو أي شيء يعتقد أنه ، لذلك لن أحصل على خطأ في التأكيد. بالطبع ، يمكنني فقط القيام ببعض البيانات إذا/آخر ، لكنني لا أريد ذلك. هل هناك أي طريقة أنيقة للقيام بذلك؟
المحلول
Python ليس لديه ما يعادلها المباشر من PHP constant()
وظيفة. إذا تم استيراد الثابت المعني من وحدة نمطية ، فإن أنظف طريقة للقيام بذلك هي مثل هذا:
import myconstants
num = int(getattr(myconstants, self.config['match_mode']))
أو إذا تم تعريفه في النطاق العالمي داخل الوحدة الحالية ، يمكنك القيام بذلك:
X = 1
num = int(globals()['X'])
في كلتا الحالتين ، أنت تفعل شيئًا محفوفًا بالمخاطر قليلاً عن طريق السماح للمستخدم بالتحكم في الكائنات التي يتعامل معها الكود. انها ليست تماما eval()
, ، لكنه قليلاً أسفل هذا الطريق. لهذا السبب قمت بتضمين int()
التحويلات هناك - يجب أن تفشل إذا قام المستخدم بتكوين النظام باسم شيء ليس عددًا صحيحًا. قد تكون هناك طرق أكثر قوة للقيام بذلك - أنا لست مرتاحًا تمامًا ، لكنه بالقرب من PHP الخاص بك constant()
رمز بدون إعادة كتابة كاملة.
نصائح أخرى
لست على دراية بـ Sphinx ، لكن بناءً على سؤالك ، سأحاول شيئًا كهذا
DEFAULT = 0
mode = getattr(self.sphinx, self.config['match_mode'], DEFAULT)
self.sphinx.SetMatchMode(mode)
هذا على افتراض أن وحدة sphinx تحدد الأوضاع في النموذج
SPH_MATCH_ANY = 0
SPH_MATCH_ALL = 1
# ....
اكتب وظيفة تقوم بتحويل سلسلة الوضع إلى عدد صحيح المقابل ، ثم استخدم ذلك عند الاتصال بالتكوين:
self.sphinx.SetMatchMode(modeToInt(self.config['match_mode']))
يمكنك أن تخلق أي شيء إذا كان/قبح آخر مطلوب في الوظيفة.