2010-08-18 17 views
2

numberofrow, 它的值是在表單字段中動態設置的。動態處理python字符串或列表

現在

因爲numberofrow是在多個表中, 當我接收從形式變量,

如果只有一個numerofrow,其字符串,用於離。 numberofrow = 01

如果多於一個numberofrow,它的一個列表,例如。 numberofrow = [01,02,04]

現在我如何區分是否它的列表或字符串在我的Python代碼?使用

在想,

if type(numberofrow).__name__=='list': 
    #do this 
else: 
    #do this 

感謝, 陽光。

+2

重複http://stackoverflow.com/questions/3227552/what-is-the-pythonic-way-of-differentiating-between-a-string-and-a-list? – Johnsyweb 2010-08-18 05:37:48

回答

5

爲此目的,有一個內置稱爲isinstance。你可以用它來檢查一個對象是否是這個類的一個實例(和你的解決方案相比,在這個測試中也考慮了超類)。

if isinstance(numberofrow, list): 
    # do this 
else: 
    # do that 

是很常見的像做isinstance(numberofrow, basestring)。 basestring是Python 2中的兩種字符串類型的超類 - str和unicode - 測試將匹配它們兩個。

或者,您也可以提供可能的類/元素的元組,如isinstance(numberofrow, (list, tuple))。如果實例是列表實例或元組,則此測試將成功。

1

你可以做你說什麼,但更好的方法是:

if isinstance(numberofrow, list): 
    # do this 
else: 
    # do that 

另一種方法是使用對象爲一個字符串,出問題的時候改變自己的行爲:

try: 
    validated = numberofrow.isdigit() 
except AttributeError: 
    # must be a list? 
    # do something else 
else: 
    # must be a string 
    # do the string thing 

如果它的行爲像一個字符串,那麼它是否是一個字符串並不重要。

+0

因爲代碼很大,所以 有可能,如果numberofrow是字符串,將它轉換成一個列表,使用與numberofrow相同的變量名稱,然後做其餘的編碼? – sunny 2010-08-18 05:37:13

+0

@sunny,這是一個好主意。這是亞歷克斯談論的數據總是列表的好處。所以,就像你說的,如果它是一個字符串,把它變成一個列表。你必須小心,因爲字符串在許多方面都像列表一樣行事(都是序列並具有該接口)。 – 2010-08-18 05:55:34

+0

@ Eric,我是這樣工作的。 @Alex,我正在使用plone框架。 感謝所有的解決方案。 – sunny 2010-08-18 06:02:53

4

您使用什麼框架從表單中獲取該值?一個明智的人肯定會提供一種方法來返回總是一個列表 - 具體地說,如果該值已被輸入一次,一個項目列表(並且可能,如果該值沒有被輸入,則是一個空列表)。

例如,具有良好的老cgi,你會使用FieldStorage實例的getlist方法 - 的form.getlist('numberofrow')代替form.getvalue('numberofrow')象你所說的,返回一個字符串或列表,它的行爲 - 這將解決你所有的問題更加簡單和優雅!