Ошибка утверждения Python, преобразование строки в int - PullRequest
0 голосов
/ 19 августа 2010

Я пытаюсь переписать мою библиотеку, написанную на PHP, в python.Он обрабатывает все запросы сфинксов.В функции init я пытаюсь установить режим поиска и сопоставления по умолчанию, но столкнулся с небольшой проблемой.Я получаю режимы из файла конфигурации.

В PHP вам нужно использовать константу в качестве ввода:

$this->sphinx->SetMatchMode(constant($this->conf['match_mode']));

Это преобразует строку из конфигурационного файла в константу, и все работает.Сложная часть начинается в python, когда я пытаюсь сделать это:

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

Поэтому мой вопрос заключается в том, как я могу преобразовать строку в целое число или что-то еще, так что я не получуошибка утверждения.Конечно, я мог бы просто сделать некоторые операторы if / else, но я этого не хочу.Есть ли какой-нибудь элегантный способ сделать это?

Ответы [ 3 ]

3 голосов
/ 19 августа 2010

Python не имеет прямого эквивалента функции PHP constant().Если рассматриваемая константа импортируется из модуля, самый простой способ сделать это так:

import myconstants
num = int(getattr(myconstants, self.config['match_mode']))

Или, если она определена в глобальной области видимости в текущем модуле, вы можете сделать это:

X = 1
num = int(globals()['X'])

В любом случае, вы делаете что-то немного рискованное, позволяя пользователю контролировать, с какими объектами работает ваш код.Это не совсем eval(), но это немного по тому пути.Вот почему я включил туда преобразования int() - они должны потерпеть неудачу, если пользователь настраивает систему с именем чего-то, что не является целым числом.Могут быть более надежные способы сделать это - мне это не совсем удобно, но это где-то близко к вашему PHP constant() коду без полного переписывания.

1 голос
/ 19 августа 2010

Я не знаком со 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
# ....
0 голосов
/ 19 августа 2010

Напишите функцию, которая преобразует строку режима в соответствующее целое число, а затем используйте ее при вызове в конфигурации:

self.sphinx.SetMatchMode(modeToInt(self.config['match_mode']))

Вы можете убрать все, если в функцию требуется безобразие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...