2011-06-17 44 views
21

có thể câu hỏi này hơi ngu ngốc nhưng tôi không biết cách kiểm tra xem biến có phải là nguyên thủy hay không. Trong java, nó giống như sau:Kiểm tra xem loại biến có phải là nguyên thủy

if var.isPrimitive(): 

Cảm ơn bạn.

+8

một "nguyên thủy" loại bằng Python là gì? :) (Một số loại hành động * một chút hài hước * trong CPython 2.x, vì cách chúng được [nguyên bản] thực hiện, nhưng không có khái niệm về kiểu "nguyên thủy".) –

+2

Bạn có ý nghĩa gì bởi "nguyên thủy"? Tôi không nghĩ Python có nguyên thủy theo cách của Java. –

+0

tốt, tôi đoán nếu nó là một bool hoặc một str, hoặc một biến số ... – telekinki

Trả lời

0

Nếu nó giúp,

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

Vì không có loại nguyên thủy bằng Python, bản thân bạn phải xác định những gì bạn xem xét nguyên thủy:

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

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

Nhưng sau đó, bạn có xem xét việc này nguyên thủy, quá :

class MyStr(str): 
    ... 

?

Nếu không, bạn có thể làm điều này:

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

Nó không phải dễ dàng để nói chắc chắn những gì để xem xét 'nguyên thủy' bằng Python. Nhưng bạn có thể tạo danh sách và kiểm tra tất cả những gì bạn muốn:

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

Trong Python, mọi thứ đều là một đối tượng; thậm chí ints và bools. Vì vậy, nếu bằng 'nguyên thủy', bạn có nghĩa là "không phải là một đối tượng" (như tôi nghĩ từ này được sử dụng trong Java), thì không có kiểu như vậy trong Python.

Nếu bạn muốn biết liệu một giá trị cụ thể (nhớ, trong biến Python không có loại, chỉ có giá trị làm) là int, float, bool hoặc bất kỳ kiểu nào bạn nghĩ là 'nguyên thủy', thì bạn có thể làm :

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

(cần tôi đề cập rằng các loại cũng được các đối tượng, với một kiểu của riêng mình?)

Nếu bạn cũng cần để giải thích cho các loại mà phân lớp được xây dựng trong các loại, kiểm tra xây dựng -in isinstance() chức năng.

Rất nhiều chuyên gia Python cố gắng viết mã đưa ra giả định tối thiểu về loại nào sẽ được gửi. Cho phép đây là một trong những điểm mạnh của ngôn ngữ: nó thường cho phép mã hoạt động theo cách bất ngờ. Vì vậy, bạn có thể muốn tránh viết mã tạo nên sự phân biệt tùy ý giữa các loại.

+1

OK, vì vậy nếu tất cả mọi thứ là một đối tượng, tại sao tôi có thể làm "1" .__ eq __ ("2") => Sai, nhưng không phải 1 .__ eq __ (2) => Cú phápError: cú pháp không hợp lệ? Đáng ngạc nhiên ... –

+4

Điều này là do một số có thể bao gồm một điểm (ví dụ: 1.23 chỉ là một số, bằng 0.e2). Điều này gây nhầm lẫn cho trình phân tích cú pháp. Nếu bạn quấn số trong dấu ngoặc đơn, nó sẽ hoạt động. (1) .__ eq __ (2) => Sai. Tuy nhiên, bạn hiếm khi cần làm điều này bằng Python. – jforberg

17

Như mọi người đều nói, không có loại nguyên thủy nào trong python. Nhưng tôi tin rằng, đây là những gì bạn muốn.

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 Bạn có thể thêm giải thích không? – mr2ert

+0

Vì vậy, theo quy tắc này, * loại * và * chức năng * không phải là nguyên thủy? Tôi chắc chắn có một cách để OP thay đổi mã của họ để nó không đòi hỏi sự phân biệt tùy ý giữa các kiểu 'nguyên thủy' và 'tổng hợp'. – jforberg

+1

Tôi nghĩ rằng có một số nhầm lẫn với những gì là một nguyên thủy và một lớp tiêu chuẩn hoặc một chức năng được xây dựng trong là gì. Nguyên thủy là nguyên thủy, chúng đơn giản và đại diện cho một phần dữ liệu đơn lẻ như thế nào. __dict__ là thuộc tính đặc biệt được sử dụng để lưu trữ các thuộc tính (có thể ghi) của đối tượng. Nếu đối tượng không có thuộc tính, thì nó là nguyên thủy. Nếu bạn chuyển hàm int ở trên cho ví dụ hoặc str: isPrimitive (int), nó sẽ nói False bởi vì nó có thuộc tính __dict__. Vì vậy, các lớp và chức năng không được coi là nguyên thủy mặc dù một int hoặc str hoặc phao, vv .. mảnh dữ liệu là một nguyên thủy – radtek

0

này hoạt động:

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

Các vấn đề liên quan