2012-10-18 29 views
0

我有舉辦一些變量作爲字符串類。例如轉換字符串變量爲其他類型

x = "1" 
y = "2.0" 
z = "timedelta(seconds=10)" 

正如您在上面看到的,變量實際上是int/float/timedelta-types。 我需要返回這些變量與他們的真實類型。 (x應作爲int返回,y應返回爲浮點數,z應返回爲datetime.timedelta)

我正在考慮更改getattr並嘗試在返回值之前找出該類型,但小測試我所做的,似乎不工作:

from datetime import datetime, timedelta 

def test(): 
    string = "timedelta(seconds=10)" 
    x = eval(string) 
    print x 
    print type(x) 
    if type(x) == 'datetime.timedelta': 
     print "YES" 
    else: 
     print "NO" 

輸出是:

0:00:10 
<type 'datetime.timedelta'> 
NO 

爲什麼是如果情況返回false?有沒有更好的方式來返回這些變量與真正的類型?

回答

4

因爲type(x)回報type不串。相反使用:

type(x) == datetime.timedelta 

# or, the better Python practice 

isinstance(x, datetime.timedelta) 
+0

似乎不work.Traceback(最新最後調用): 文件 「eval.py」,14號線在 試驗(+) 文件「EVAL。py「,第8行,在測試 如果isinstance(x,datetime.timedelta): AttributeError:類型對象的'datetime.datetime'沒有屬性'timedelta' – theAlse

+0

這是因爲你有'從datetime導入日期時間',在我的例子我通過一個完整的「模塊路徑」來引用'timedelta',只需將'datetime.timedelta'替換爲'timedelta'。注意,在Python中使用'eval()'被認爲是一個非常糟糕的做法,請參見http:// stackoverflow .com/questions/1087255/use-of-eval-in-python瞭解詳情。 –

1

您比較類型和字符串。試試這個:

>>> type(x) == timedelta 
True 
0

'datetime.timedelta'的類型是str。我認爲你的意思是做if type(x) == timedelta:,這將做正確的類型檢查。

1

您正在比較字符串與類型,因此它返回false。

這是最好的,如果你使用:

isinstance(x, datetime.timedelta) 

見這一段代碼,它清楚地告訴你如何檢查類型:

>>> foo = {} 

    >>> type(foo) 
    <type 'dict'> 

    >>> class MyDict(dict): 
    ...  pass 

    >>> bar = MyDict() 

    >>> type(bar) 
    <class '__main__.MyDict'> 

    >>> type(bar) == dict 
    False      # Unexpected result 

    >>> isinstance(bar, dict) 
    True      # Expected result 
0

簡短的答案(我想這是你想要的只是這個問題):

1.you導入timedelta,和它的名字timedelta._ _是一個字符串'timedelta'

2. X =與eval(String),這裏X的timedelta已導入aboved。

所以,這很簡單,只是比較式(X)._ _timedelta._ _,如果你只是希望他們用繩子:)比較