2011-06-17 20 views
21

多分この質問はちょっとばかですが、変数がプリミティブかどうかをチェックする方法はわかりません。 javaの場合は次のようになります。変数の型がプリミティブであることを確認してください

if var.isPrimitive(): 

ありがとうございます。

+8

Pythonで "原始的" タイプとは何ですか? :)(いくつかの型は、CPython 2では少し面白い*を演じます。x、なぜ彼らは[基本的に]実装されているので、 "プリミティブ"タイプの概念はありません) –

+2

"プリミティブ"とはどういう意味ですか? PythonにはJavaのやり方とは異なるプリミティブがあるとは思いません。 –

+0

よく、私はそれがboolかstrか数値変数かどうか推測します... – telekinki

答えて

0

それは、

In [1]: type(1) 
Out[1]: <type 'int'> 

In [2]: type('a') 
Out[2]: <type 'str'> 

In [3]: (type(5.4) 
Out[3]: <type 'float'> 

In [5]: type(object) 
Out[5]: <type 'type'> 

In [8]: type(int) 
Out[8]: <type 'type'> 
31

を助けている場合はPythonにはプリミティブ型が存在しないので、あなた自身はあなたが原始的と考えるものを定義する必要があります。

primitive = (int, str, bool, ...) 

def is_primitive(thing): 
    return isinstance(thing, primitive) 

しかし、その後、あなたも、これは原始的な考慮ん:

class MyStr(str): 
    ... 

ない場合は、この操作を行うことができます:

def is_primitive(thing): 
    return type(thing) in primitive 
2

それはPythonで「原始的」を検討するために絶対に何を言うのは簡単ではありません。しかし、あなたは、あなたがしたいリストを作成し、すべてを確認することができます。

is_primitive = isinstance(myvar, (int, float, bool)) # extend the list to taste 
21

、すべてが対象です。 intとboolでさえ。したがって、「プリミティブ」で「オブジェクトではない」(Javaで使用されていると思う)場合は、Pythonではそのような型はありません。

与えられた値(Python変数には型がないことを覚えておいてください)は、int型、float型、bool型のいずれであっても、「プリミティブ」と考えることができます。 :

if type(myval) in (int, float, bool, str ...): 
     # Sneaky stuff 

は(私はタイプはまた、独自のタイプで、オブジェクトであることを言及が必要ですか?)

あなたはまた、ビルトインタイプ、チェックアウト建てサブクラスの種類を説明するために必要がある場合-in isinstance()関数です。

Python gurusは、どのタイプが送られるかを最小限にするコードを書こうとしています。これを許可することは、コードが予期しない方法で動作することを可能にします。だから、タイプ間の任意の区別をするコードを書くことを避けたいかもしれません。

+1

すべてがオブジェクトの場合、なぜ "1"を実行できますか?__ eq __( "2")=> Falseですが、1 .__ eq __(2)=> SyntaxError:構文が無効ですか?驚いたことに... –

+4

これは、数字にポイントを含めることができるからです(たとえば、1.23は数字であり、0.e2です)。これはパーサを混乱させます。番号をかっこで囲むと、それが機能します。 (1).__ eq __(2)=> Falseです。しかし、Pythonでこれを行う必要はほとんどありません。 – jforberg

17

誰もが言うように、Pythonにはプリミティブ型はありません。しかし、私は信じています、これはあなたが望むものです。

def isPrimitive(obj): 
    return not hasattr(obj, '__dict__') 

isPrimitive(1) => True 
isPrimitive("sample") => True 
isPrimitive(213.1311) => True 
isPrimitive({}) => True 
isPrimitive([]) => True 
isPrimitive(()) => True 


class P: 
    pass 

isPrimitive(P) => False 
isPrimitive(P()) => False 

def func(): 
    pass 

isPrimitive(func) => False 
+0

+1説明を追加できますか? – mr2ert

+0

このルールでは、* type *と* function *はプリミティブではありませんか?私はOPが自分のコードを言い換えて「プリミティブ」と「集約」タイプの間に任意の区別を必要としないようにする方法があると確信しています。 – jforberg

+1

私は、プリミティブとは何か混乱していると思いますし、標準クラスまたは組み込み関数は何ですか?プリミティブは基本的なものであり、シンプルであり、次のような単一のデータを表します。 __dict__は、オブジェクトの(書き込み可能な)属性を格納するために使用される特別な属性です。オブジェクトに属性がない場合は、そのプリミティブです。例えば、上記の関数intを渡すと、str:isPrimitive(int)は__dict__属性を持っているのでFalseとなります。したがって、クラスや関数は、intやstrやfloatなどがプリミティブであっても、プリミティブとはみなされません。 – radtek

0

これは動作します:

try: 
    import builtins 
except ImportError: 
    import __builtin__ as builtins 

def get_primitives(): 
    return list(filter(lambda x: not x.startswith('_'), dir(builtins))) 

をPythonの3.6:

In [241]: get_primitives() 
Out[241]: 
['ArithmeticError', 
'AssertionError', 
'AttributeError', 
'BaseException', 
'BlockingIOError', 
'BrokenPipeError', 
'BufferError', 
'BytesWarning', 
'ChildProcessError', 
'ConnectionAbortedError', 
'ConnectionError', 
'ConnectionRefusedError', 
'ConnectionResetError', 
'DeprecationWarning', 
'EOFError', 
'Ellipsis', 
'EnvironmentError', 
'Exception', 
'False', 
'FileExistsError', 
'FileNotFoundError', 
'FloatingPointError', 
'FutureWarning', 
'GeneratorExit', 
'IOError', 
'ImportError', 
'ImportWarning', 
'IndentationError', 
'IndexError', 
'InterruptedError', 
'IsADirectoryError', 
'KeyError', 
'KeyboardInterrupt', 
'LookupError', 
'MemoryError', 
'ModuleNotFoundError', 
'NameError', 
'None', 
'NotADirectoryError', 
'NotImplemented', 
'NotImplementedError', 
'OSError', 
'OverflowError', 
'PendingDeprecationWarning', 
'PermissionError', 
'ProcessLookupError', 
'RecursionError', 
'ReferenceError', 
'ResourceWarning', 
'RuntimeError', 
'RuntimeWarning', 
'StopAsyncIteration', 
'StopIteration', 
'SyntaxError', 
'SyntaxWarning', 
'SystemError', 
'SystemExit', 
'TabError', 
'TimeoutError', 
'True', 
'TypeError', 
'UnboundLocalError', 
'UnicodeDecodeError', 
'UnicodeEncodeError', 
'UnicodeError', 
'UnicodeTranslateError', 
'UnicodeWarning', 
'UserWarning', 
'ValueError', 
'Warning', 
'ZeroDivisionError', 
'abs', 
'all', 
'any', 
'ascii', 
'bin', 
'bool', 
'bytearray', 
'bytes', 
'callable', 
'chr', 
'classmethod', 
'compile', 
'complex', 
'copyright', 
'credits', 
'delattr', 
'dict', 
'dir', 
'display', 
'divmod', 
'enumerate', 
'eval', 
'exec', 
'filter', 
'float', 
'format', 
'frozenset', 
'get_ipython', 
'getattr', 
'globals', 
'hasattr', 
'hash', 
'help', 
'hex', 
'id', 
'input', 
'int', 
'isinstance', 
'issubclass', 
'iter', 
'len', 
'license', 
'list', 
'locals', 
'map', 
'max', 
'memoryview', 
'min', 
'next', 
'object', 
'oct', 
'open', 
'ord', 
'pow', 
'print', 
'property', 
'range', 
'repr', 
'reversed', 
'round', 
'set', 
'setattr', 
'slice', 
'sorted', 
'staticmethod', 
'str', 
'sum', 
'super', 
'tuple', 
'type', 
'vars', 
'zip'] 

関連する問題