سؤال

أحاول إعادة كتابة 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']))

يمكنك أن تخلق أي شيء إذا كان/قبح آخر مطلوب في الوظيفة.

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