0

我有一个将一些变量作为字符串保存的类。例如

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

正如您在上面看到的,变量实际上是 int/float/timedelta 类型。我需要用它们的真实类型返回这些变量。(x 应该作为 int 返回,y 应该作为 float 返回,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

为什么 if-case 返回 false?有没有更好的方法用真实类型返回这些变量?

4

5 回答 5

4

因为type(x)返回type不是字符串。而是使用:

type(x) == datetime.timedelta

# or, the better Python practice

isinstance(x, datetime.timedelta)
于 2012-10-18T07:14:26.403 回答
1

您正在比较一个类型和一个字符串。试试这个:

>>> type(x) == timedelta
True
于 2012-10-18T07:13:05.627 回答
1

您正在将 string 与 type 进行比较,因此它返回 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
于 2012-10-18T07:16:55.417 回答
0

的类型'datetime.timedelta'是 str。我认为您的意思是 do if type(x) == timedelta:,它将进行正确的类型检查。

于 2012-10-18T07:14:17.197 回答
0

简短的回答(我认为这就是你想要的这个问题):

1.你导入timedelta,它的名字timedelta._ name _是一个字符串'timedelta'

2. x = eval(string),这里x的类型是你在上面导入的timedelta

所以,这很简单,只需将type(x)._ name _timedelta._ name _进行比较,如果您只想将它​​们与字符串进行比较 :)

于 2012-10-18T07:41:02.803 回答