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)

このコードを参照してください。 type を確認する方法が明確に示されています。

    >>> 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

簡単な答え(これがこの質問のためだけに欲しいものだと思います):

1. timedeltaをインポートし、その名前はtimedelta._ name _は文字列'timedelta'です。

2. x = eval(string)、ここで x のは上記でインポートした timedelta です

type(x)._ name _とtimedelta._ name _比較するだけです。文字列と比較したい場合:)

于 2012-10-18T07:41:02.803 に答える
0

の型'datetime.timedelta'は str です。私はあなたif type(x) == timedelta:が正しい型チェックを行うことを意味していると思います。

于 2012-10-18T07:14:17.197 に答える