簡體   English   中英

Python斷言錯誤,將字符串轉換為int

[英]Python assertion error, converting string to int

我正在嘗試將用PHP編寫的lib重寫為python。 它處理所有獅身人面像的請求。 在初始化函數中,我試圖設置默認的搜索和匹配模式,但是遇到了一個小問題。 我從配置文件中獲取模式。

在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語句,但是我不想要那樣。 有什么優雅的方法可以做到這一點嗎?

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)

假設sphinx模塊以以下形式定義了模式

SPH_MATCH_ANY = 0
SPH_MATCH_ALL = 1
# ....

編寫一個將模式字符串轉換為相應整數的函數,然后在配置中調用時使用該函數:

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

如果該功能需要/不很丑陋,您可以放棄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM