Làm thế nào để thử nghiệm


398

Tôi có một phương thức đôi khi trả về giá trị noneType. Vậy làm thế nào tôi có thể đặt câu hỏi cho một biến là Không có Loại? Tôi cần sử dụng phương thức if , ví dụ

if not new:
    new = '#'

Tôi biết đó là cách sai và tôi hy vọng bạn hiểu ý của tôi.


Tôi nghĩ rằng điều này đã được trả lời ở đây và dường như ở đâu đó trước đây
yorodm

Nếu Nonelà giá trị duy nhất mà phương thức của bạn trả về bool(returnValue)bằng False, thì if not new:nên hoạt động tốt. Điều này đôi khi xảy ra trong các re.matchlib tích hợp - ví dụ, trả về Không hoặc đối tượng khớp trung thực.
Kevin

Cũng xem câu trả lời của tôi về nullNonetrong python ở đây .
Michael Ekoka

Câu trả lời:


631

Vậy làm thế nào tôi có thể đặt câu hỏi cho một biến là Không có Loại?

Sử dụng istoán tử, như thế này

if variable is None:

Tại sao điều này hoạt động?

Nonelà đối tượng singleton duy nhất của NoneTypePython, chúng ta có thể sử dụng istoán tử để kiểm tra xem một biến có Nonetrong đó hay không.

Trích dẫn từ istài liệu ,

Các toán tử isis notkiểm tra nhận dạng đối tượng: x is ylà đúng khi và chỉ khi xylà cùng một đối tượng. x is not ymang lại giá trị thật ngược.

Vì chỉ có thể có một trường hợp None, isnên sẽ là cách ưa thích để kiểm tra None.


Nghe nó từ miệng ngựa

Trích dẫn Nguyên tắc kiểu mã hóa của Python - PEP-008 (do chính Guido định nghĩa),

Việc so sánh với các singletons như vậy Nonephải luôn luôn được thực hiện với ishoặcis not , không bao giờ là các toán tử đẳng thức .


Vì vậy, sự khác biệt giữa == Noneis None?
NoName

@NoName Đối với None, cả hai sẽ mang lại kết quả tương tự.
thefourtheye

2
điều này không hoạt động nếu so sánh liệu pandasDataFrame có tồn tại hay không - vì điều đó, tôi sử dụng type(df) is type(None)để tránh:The truth value of a DataFrame is ambiguous
Marc Maxmeister


27

Nó cũng có thể được thực hiện isinstancetheo câu trả lời của Alex Hall :

>>> NoneType = type(None)
>>> x = None
>>> type(x) == NoneType
True
>>> isinstance(x, NoneType)
True

isinstance cũng trực quan nhưng có sự phức tạp mà nó đòi hỏi dòng

NoneType = type(None)

mà không cần thiết cho các loại như intfloat.


Vì bạn không thể phân lớp NoneTypevà vì Nonelà một đơn, isinstancenên không được sử dụng để phát hiện None- thay vào đó bạn nên làm như câu trả lời được chấp nhận nói và sử dụng is Nonehoặc is not None.
Aaron Hall

18

Như được chỉ ra bởi nhận xét của Aaron Hall:

Vì bạn không thể phân lớp NoneTypevà vì Nonelà một đơn, isinstancenên không được sử dụng để phát hiện None- thay vào đó bạn nên làm như câu trả lời được chấp nhận nói và sử dụng is Nonehoặc is not None.


Câu trả lời gốc:

Tuy nhiên, cách đơn giản nhất, không có dòng bổ sung ngoài câu trả lời của thảo quả có lẽ là:
isinstance(x, type(None))

Vậy làm thế nào tôi có thể đặt câu hỏi cho một biến là Không có Loại? Tôi cần sử dụng nếu phương thức

Việc sử dụng isinstance()không yêu cầu istrong phạm vi if:

if isinstance(x, type(None)): 
    #do stuff

Thông tin bổ sung
Bạn cũng có thể kiểm tra nhiều loại trong một isinstance()tuyên bố như được đề cập trong tài liệu . Chỉ cần viết các loại như một tuple.

isinstance(x, (type(None), bytes))

1
Vì bạn không thể phân lớp NoneTypevà vì Nonelà một đơn, isinstancenên không được sử dụng để phát hiện None- thay vào đó bạn nên làm như câu trả lời được chấp nhận nói và sử dụng is Nonehoặc is not None.
Aaron sảnh

1
Câu trả lời này rất hữu ích chopython 3.6.7
Santhosh Dhaipule Chandrakanth

@AaronHall Tại sao isinstance không nên sử dụng? Tôi hiểu rằng isnên được ưu tiên, nhưng có một số trường hợp hình thức isinstance cảm thấy tự nhiên hơn (như kiểm tra nhiều loại cùng một lúc isinstance(x, (str, bool, int, type(None)))). Đây chỉ là một sở thích cá nhân hay có sự cảnh báo mà tôi không biết?
Conliclicultor

@Conchylicultor nhược điểm cho đề xuất của bạn: 1. tra cứu toàn cầu cho type2. sau đó gọi nó là 3. sau đó tìm kiếm loại None- khi Nonecả hai là một từ đơn và một từ khóa. Một nhược điểm khác: 4. điều này rất không chuẩn và sẽ làm nhướn mày khi mọi người đang nhìn vào mã của bạn. x is Nonelà một kiểm tra tối ưu hơn. Tôi sẽ đề nghị x is None or isinstance(x, (str, bool, int))- nhưng tôi cũng đề nghị bạn suy nghĩ thêm về những gì bạn đang làm khi bạn thực hiện loại kiểm tra loại đó không có nhiều điểm chung ...
Aaron Hall

4

Không chắc chắn nếu điều này trả lời câu hỏi. Nhưng tôi biết điều này đã khiến tôi mất một thời gian để tìm ra. Tôi đang lướt qua một trang web và đột nhiên tên của các tác giả không còn ở đó nữa. Vì vậy, cần một tuyên bố kiểm tra.

if type(author) == type(None):
     my if body
else:
    my else body

Tác giả có thể là bất kỳ biến nào trong trường hợp này và Nonecó thể là bất kỳ loại nào bạn đang kiểm tra.


Nonelà một singleton, typekhông nên được sử dụng để phát hiện None- thay vào đó bạn nên làm như câu trả lời được chấp nhận nói và sử dụng is Nonehoặc is not None.
Aaron Hall

2

Python 2.7:

x = None
isinstance(x, type(None))

hoặc là

isinstance(None, type(None))

==> Đúng


1
Vì bạn không thể phân lớp NoneTypevà vì Nonelà một đơn, isinstancenên không được sử dụng để phát hiện None- thay vào đó bạn nên làm như câu trả lời được chấp nhận nói và sử dụng is Nonehoặc is not None.
Aaron sảnh

Ồ được thôi! Cảm ơn !
Pesko

0

Tôi hy vọng ví dụ này sẽ hữu ích cho bạn)

print(type(None) # NoneType

Vì vậy, bạn có thể kiểm tra loại tên biến

#Example
name = 12 # name = None
if type(name) != type(None):
    print(name)
else:
    print("Can't find name")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.