4

「変数」が文字列、リスト、dict、または数値のように組み込まれており、「オブジェクト」ではないかどうかを判断するにはどうすればよいですか。組み込み型をコピーするがオブジェクトを無視する dict に対して、ディープコピーっぽい関数を実行しようとしています。

4

8 に答える 8

3

すべてがオブジェクトです。特定のオブジェクトが文字列なのか整数なのか、それとも別の型なのかを調べたい場合は、次を使用しますisinstance()

>>> isinstance("hello!", str)
True
>>> isinstance("hello!", int)
False

したがって、あなたの場合、辞書でのみ関数を呼び出したいようです:

>>> mylist = [3, "cabbage", 5.43, {'cat':'dog'}, {'horse':'elephant'}, ['another', 'list']]
>>> for i in mylist:
...     if isinstance(i, dict):
...         dostuff()
于 2013-06-12T07:13:01.543 に答える
2

組み込みの型はほとんどないため、if を使用して確認できます。

if type(a)==int or type(a)==float or type(a)==str or type(a)==list or type(a)==dict:
        #do something

または使用isinstance()

if isinstance(a,(int,float,str,list,dict,set)):
    #do something

これが正しい方法かどうかはわかりません。ただし、指定された変数が組み込みデータ型のインスタンスであるかどうかを確認する方法の 1 つです。

于 2013-06-12T07:12:44.507 に答える
0

CPythonのみのアプローチ (他の実装でも機能する可能性があります):

import __builtin__

builtin_types = [x for x in __builtin__.__dict__.values() if isinstance(x, type)]
def is_builtin_type(x):
  for t in builtin_types:
    if isinstance(x, t):
       return True 

これは、組み込みの例外、バイト配列、オブジェクト、および他のいくつかの例外をカバーしていますが、他の回答者は言及していません:-)

于 2013-06-12T07:36:49.167 に答える
0

参考までに、私はこの解決策を採用しました:(これに触発されました

from six import integer_types, string_types, text_type

_copyable_types = (
    integer_types,
    string_types,
    text_type,
    list,
    dict,
    set,
)


def deepish_copy(org):
    '''
    Will copy a dict but ignore user objects at top level.
    '''
    out = {}

    for k, v in org.iteritems():
        if isinstance(v, _copyable_types):
            try:
                out[k] = v.copy()   # dicts, sets
            except AttributeError:
                try:
                    out[k] = v[:]   # lists, tuples, strings, unicode
                except TypeError:
                    out[k] = v      # ints

    return out
于 2013-06-12T08:10:33.690 に答える
0

まず第一に、Python ではクラスと型の間に違いはありません。

>>> type("234"), "234".__class__
(str, str)

次に、オブジェクトの型をテストすることには、2 つの異なる意味があります。

isinstanceオブジェクトが特定のタイプまたはサブタイプであるかどうかをテストします。

>>> class mystr(str): pass
>>> s = mystr(4)
>>> s
'4'
>>> ype(s)
__main__.mystr
>>> isinstance(s, str)
True

一方

>>> type(s) is str
False
>>> type(s)
<class '__main__.mystr'>

ちなみに書いてはいけないのですtype(s) == strtype(s) is str

あなたの質問に対する可能な答え:組み込み型のモジュールは__builtin__

>>> str.__module__
'__builtin__'
>>> mystr.__module__
'__main__'

だからあなたはおそらく書くことができます

>>> def is_of_builtin_type(obj):
        return type(obj).__module__ == '__builtin__'
>>> is_of_builtin_type("4223")
True
>>> class mystr(str): pass
>>> is_of_builtin_type(mystr(223))
False

注: これがどれほど堅牢かはテストしていません。

于 2013-06-12T07:37:26.920 に答える
-2

わかりやすい

指定された variable に対してvar、関数を使用すると、 が型の場合とそうでない場合がisinstance(var, type)返されます。これはインタープリターで簡単に確認できます。TruevartypeFalse

>>> a = 2
>>> isinstance(a, int)
True
>>> b = 'correct'
>>> isinstance(b, int)
False
>>> c = [1,2,3,4]
>>> isinstance(c, list)
True

...等々。itemしたがって、それが aであることを確認したい場合dict:

if isinstance(item, dict):
    # handle the dict, do your deep copy
else:
    # meh, whatever

あるいは

以下を許可するtypesモジュールの使用を検討してください。

from types import DictType
def dictate(item):
    if isinstance(item, dict):
       # handle the dict
    else:
       # panic!
于 2013-06-12T07:11:14.630 に答える