0

我正在尝试将用 PHP 编写的 lib 重写为 python。它处理所有 sphinx 请求。在初始化函数中,我试图设置默认的搜索和匹配模式,但我遇到了一个小问题。我从配置文件中获取模式。

在 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 语句,但我不想那样做。有什么优雅的方法可以做到这一点吗?

4

3 回答 3

3

Python 没有直接等效的 PHPconstant()函数。如果有问题的常量是从模块中导入的,最简洁的方法是这样的:

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

或者,如果它是在当前模块的全局范围内定义的,您可以这样做:

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

无论哪种方式,通过让用户控制您的代码处理哪些对象,您都在做一些有点冒险的事情。不完全是eval(),但它离那条路有点远。这就是我在其中包含int()转换的原因 - 如果用户使用非整数名称配置系统,它们应该会失败。可能有更强大的方法可以做到这一点 - 我不太喜欢它,但它与您的 PHPconstant()代码接近,无需完全重写。

于 2010-08-19T16:44:52.453 回答
1

我不熟悉狮身人面像,但根据你的问题,我会尝试这样的事情

DEFAULT = 0
mode = getattr(self.sphinx, self.config['match_mode'], DEFAULT)
self.sphinx.SetMatchMode(mode)

假设 sphinx 模块以形式定义模式

SPH_MATCH_ANY = 0
SPH_MATCH_ALL = 1
# ....
于 2010-08-19T16:41:52.667 回答
0

编写一个将模式字符串转换为相应整数的函数,然后在配置中调用时使用它:

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

您可以将任何需要的 if/else 丑陋内容放入函数中。

于 2010-08-19T16:33:33.360 回答