2012-02-22 33 views
30

Điều này là khá cơ bản nhưng tôi đã được mã hóa và bắt đầu tự hỏi nếu có một cách pythonic để kiểm tra nếu một cái gì đó không tồn tại. Đây là cách tôi làm điều đó nếu nó đúng:cách nhiệt tình để kiểm tra xem có gì đó tồn tại không?

var = 1 
if var: 
    print 'it exists' 

nhưng khi tôi kiểm tra xem một cái gì đó không tồn tại, tôi thường làm một cái gì đó như thế này:

var = 2 
if var: 
    print 'it exists' 
else: 
    print 'nope it does not' 

Có vẻ như một sự lãng phí nếu tất cả tôi quan tâm là knIs có một cách để kiểm tra xem một cái gì đó không tồn tại mà không có người khác?

+0

Luôn có thứ ba: http://stackoverflow.com/questions/394809/python-ternary-operator :) ... nghĩ rằng đó có thể không phải là cách Pythonic nhất để viết nó ra. – summea

+3

Nếu 'var' không thực sự ** tồn tại **, thì bạn sẽ nhận được một ngoại lệ khi bạn cố gắng sử dụng nó. Đó là bên ngoài những gì 'if' /' else' có thể xử lý. 'if var' ** giả định **' var' tồn tại, và ** tests ** nếu nó là "true-ish" (trở thành True thay vì False nếu được chuyển thành boolean). –

+1

Bạn không kiểm tra sự tồn tại của một biến, nhưng kiểm tra nếu giá trị của nó là 'True'as một bối cảnh boolean. – FallenAngel

Trả lời

83

LBYL phong cách, "nhìn trước khi bạn bước nhảy vọt":

var_exists = 'var' in locals() or 'var' in globals() 

EAFP phong cách "dễ dàng hơn để cầu xin tha thứ hơn cho phép":

try: 
    var 
except NameError: 
    var_exists = False 
else: 
    var_exists = True 

thích phong cách thứ hai (EAFP) khi mã hóa trong Python, bởi vì nó thường đáng tin cậy hơn.

+0

Kiểm tra nếu var không tồn tại: 'var' không phải trong locals() và 'var' không có trong globals() – MyopicVisage

16

Tôi nghĩ bạn phải cẩn thận với thuật ngữ của mình, cho dù có điều gì đó tồn tại và điều gì đó được đánh giá là False là hai điều khác nhau. Giả sử bạn muốn sau này, bạn chỉ có thể làm:

if not var: 
    print 'var is False' 

Đối với trước đây, nó sẽ càng ít thanh lịch:

try: 
    var 
except NameError: 
    print 'var not defined' 

Tôi sẽ lấy một bước nhảy vọt và mạo hiểm, tuy nhiên, bất cứ điều gì là làm cho bạn muốn kiểm tra xem một biến được xác định có thể có thể được giải quyết một cách thanh lịch hơn.

+0

xin lỗi không có nghĩa là sai. có nghĩa là nếu nó không tồn tại. Tôi sử dụng nó thường xuyên hơn trong các truy vấn sql (tôi bọc một câu lệnh if trong một truy vấn chọn và nếu không có kết quả nào xuất hiện trở lại thì tôi thực hiện một số công việc), vì vậy không phải tìm kiếm sai không tồn tại. – Lostsoul

+0

cũng 'config = config()' và sau đó 'if not config:' cung cấp cho tôi "cấu hình biến cục bộ được tham chiếu trước khi assigment" :) – holms

0

Điều gì về từ chối?

if not var: 
    print 'nope it does not' 

Mặc dù điều này là để xem nếu var là false/none và sẽ nổ nếu var không được xác định.

Để xem nếu var được định nghĩa:

try: 
    var 
except NameError: 
    print 'not defined' 
0
if not var: 
    #Var is None/False/0/ 

if var: 
    #Var is other then 'None/False/0' 

bằng Python nếu varibale là có bất kỳ giá trị từ None/False/0 thì If var điều kiện sẽ thất bại ...

và cho khác đối tượng nó sẽ gọi phương thức pythonic __nonzero__ có thể trả lại True hoặc False tùy thuộc vào chức năng của nó.

+2

Điều này sẽ không xử lý trường hợp biến không bao giờ được xác định, đó là câu hỏi của OP. – btown

2

Để kiểm tra xem một var đã được xác định:

var = 2 

try: 
    varz 
except NameError: 
    print("No varz") 

Để kiểm tra xem nó là None/False

if varz is None 

... hoặc

if not varz 
2

Nếu đây là một từ điển, bạn có thể có

mydict['ggg'] = '' // doesn't matter if it is empty value or not. 
if mydict.has_key('ggg'): 
    print "OH GEESH" 

Tuy nhiên, has_key() là hoàn toàn ra khỏi Python 3.x, do đó, cách Python là sử dụng in

'ggg' in mydict  # this is it! 
# True if it exists 
# False if it doesn't 

Bạn có thể sử dụng in cho tuple, danh sách, và thiết lập là tốt.


Tất nhiên, nếu biến chưa được xác định, bạn sẽ phải đưa ra một ngoại lệ âm thầm (ngoại trừ bất kỳ ngoại lệ nào ... bỏ qua), nếu ngoại lệ không phải là điều bạn muốn xem (đó là hữu ích cho nhiều ứng dụng, bạn chỉ cần đăng nhập một ngoại lệ.)


nó luôn luôn là an toàn để xác định một biến trước khi bạn sử dụng nó (bạn sẽ chạy vào "nhiệm vụ trước khi tham khảo địa phương" có nghĩa là "var không nằm trong phạm vi "bằng tiếng Anh đơn giản". Nếu bạn làm điều gì đó với truy vấn, cơ hội là, bạn sẽ muốn có một từ điển và kiểm tra xem một khóa có tồn tại hay không, sử dụng in.

+0

Đơn giản nhất trong tất cả các giải pháp – DrStrangepork

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