我试图将用PHP写入Python的LIB重写。它处理所有狮身人面像请求。在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

因此,我的问题是,如何将字符串转换为整数或它所认为的任何内容,因此我不会遇到断言错误。当然,如果/其他陈述,我可以做一些,但我不想要那个。有什么优雅的方法吗?

有帮助吗?

解决方案

Python与PHP的直接等效 constant() 功能。如果从模块导入所讨论的常数,则最清洁的方法就是这样:

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

或者,如果它在当前模块内的全局范围定义,则可以执行此操作:

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

无论哪种方式,您都可以通过让用户控制对象处理您的代码处理的用户控制。不是很 eval(), ,但这是沿着那条路的路要走。这就是为什么我包括 int() 在那里的转换 - 如果用户使用不是整数的东西的名称配置系统,则应失败。可能有更多可靠的方法来做到这一点 - 我对此不满意,但它靠近您的PHP constant() 没有完整重写的代码。

其他提示

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

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

假设狮身人面像模块在形式中定义了模式

SPH_MATCH_ANY = 0
SPH_MATCH_ALL = 1
# ....

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

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

如果需要在功能中需要丑陋的话,您可以将任何东西搁置。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top