Hướng dẫn check variable exist python - kiểm tra biến tồn tại python

Việc sử dụng các biến chưa được xác định hoặc đặt (ngầm hoặc rõ ràng) thường là một điều xấu trong bất kỳ ngôn ngữ nào, vì nó có xu hướng chỉ ra rằng logic của chương trình không được nghĩ đến đúng cách và có khả năng là kết quả trong hành vi không thể đoán trước.

Nếu bạn cần làm điều đó trong Python, thủ thuật sau, tương tự như của bạn, sẽ đảm bảo rằng một biến có một số giá trị trước khi sử dụng:

try:
    myVar
except NameError:
    myVar = None      # or some other default value.

# Now you're free to use myVar without Python complaining.

Tuy nhiên, tôi vẫn không tin rằng đó là một ý tưởng tốt - theo tôi, bạn nên cố gắng tái cấu trúc mã của mình để tình huống này không xảy ra.

Bằng cách ví dụ, mã sau được đưa ra dưới đây trong một bình luận, để cho phép vẽ dòng từ điểm trước đến điểm hiện tại:

if last:
    draw(last, current);
last = current

Trong trường hợp

if last:
    draw(last, current);
last = current
3 không bị ràng buộc với một giá trị, điều đó sẽ không giúp ích gì cho Python vì ngay cả việc kiểm tra
if last:
    draw(last, current);
last = current
3 cũng sẽ tăng một ngoại lệ. Một ý tưởng tốt hơn là đảm bảo
if last:
    draw(last, current);
last = current
3 có giá trị, một ý tưởng có thể được sử dụng để quyết định xem nó có hợp lệ hay không. Đó sẽ là một cái gì đó như:

last = None

# some time passes ...

if last is not None:
    draw(last, current);
last = current

Điều đó đảm bảo biến tồn tại và bạn chỉ sử dụng nó nếu nó hợp lệ cho những gì bạn cần. Đây là những gì tôi giả sử

if last:
    draw(last, current);
last = current
6 có nghĩa là phải làm trong mã bình luận (nhưng không) và bạn vẫn có thể thêm mã để buộc điều này nếu bạn không kiểm soát cài đặt ban đầu của biến, sử dụng phương thức ngoại lệ ở trên :

# Variable 'last' may or may not be bound to a value at this point.

try:
    last
except NameError:
    last = None

# It will always now be bound to a value at this point.

if last is not None:
    draw(last, current);
last = current

Cải thiện bài viết

Lưu bài viết

  • Đọc
  • Bàn luận
  • Cải thiện bài viết

    Lưu bài viết

    Đọc

    Bàn luận

    Các biến trong Python có thể được xác định cục bộ hoặc toàn cầu. Có hai loại biến đầu tiên là một biến cục bộ được xác định bên trong hàm và loại thứ hai là biến toàn cầu được xác định bên ngoài hàm. & NBSP;

    Python3

    Phương pháp 1: Kiểm tra sự tồn tại của biến cục bộ

    Để kiểm tra sự tồn tại của các biến cục bộ, chúng tôi sẽ sử dụng hàm locals () để lấy từ điển của bảng ký hiệu cục bộ hiện tại. & Nbsp;

    if last:
        draw(last, current);
    last = current
    
    7
    if last:
        draw(last, current);
    last = current
    
    8

    if last:
        draw(last, current);
    last = current
    
    9
    last = None
    
    # some time passes ...
    
    if last is not None:
        draw(last, current);
    last = current
    
    0
    last = None
    
    # some time passes ...
    
    if last is not None:
        draw(last, current);
    last = current
    
    1
    last = None
    
    # some time passes ...
    
    if last is not None:
        draw(last, current);
    last = current
    
    2

    # Variable 'last' may or may not be bound to a value at this point.
    
    try:
        last
    except NameError:
        last = None
    
    # It will always now be bound to a value at this point.
    
    if last is not None:
        draw(last, current);
    last = current
    
    2

    Output:

    True

    if last: draw(last, current); last = current 9last = None # some time passes ... if last is not None: draw(last, current); last = current 4 last = None # some time passes ... if last is not None: draw(last, current); last = current 5 last = None # some time passes ... if last is not None: draw(last, current); last = current 6 last = None # some time passes ... if last is not None: draw(last, current); last = current 7____28 the existence of a globel variable

    last = None
    
    # some time passes ...
    
    if last is not None:
        draw(last, current);
    last = current
    
    9
    # Variable 'last' may or may not be bound to a value at this point.
    
    try:
        last
    except NameError:
        last = None
    
    # It will always now be bound to a value at this point.
    
    if last is not None:
        draw(last, current);
    last = current
    
    0
    # Variable 'last' may or may not be bound to a value at this point.
    
    try:
        last
    except NameError:
        last = None
    
    # It will always now be bound to a value at this point.
    
    if last is not None:
        draw(last, current);
    last = current
    
    1

    Python3

    Phương pháp 2: Kiểm tra sự tồn tại của biến Globel

    Để kiểm tra sự tồn tại của các biến trên toàn cầu, chúng tôi sẽ sử dụng hàm Globals () để có được từ điển của bảng biểu tượng toàn cầu hiện tại. & NBSP;

    last = None
    
    # some time passes ...
    
    if last is not None:
        draw(last, current);
    last = current
    
    0
    last = None
    
    # some time passes ...
    
    if last is not None:
        draw(last, current);
    last = current
    
    1
    last = None
    
    # some time passes ...
    
    if last is not None:
        draw(last, current);
    last = current
    
    2

    if last:
        draw(last, current);
    last = current
    
    9
    last = None
    
    # some time passes ...
    
    if last is not None:
        draw(last, current);
    last = current
    
    0
    last = None
    
    # some time passes ...
    
    if last is not None:
        draw(last, current);
    last = current
    
    1
    last = None
    
    # some time passes ...
    
    if last is not None:
        draw(last, current);
    last = current
    
    2

    # Variable 'last' may or may not be bound to a value at this point.
    
    try:
        last
    except NameError:
        last = None
    
    # It will always now be bound to a value at this point.
    
    if last is not None:
        draw(last, current);
    last = current
    
    2

    Output:

    False

    if last: draw(last, current); last = current 9last = None # some time passes ... if last is not None: draw(last, current); last = current 4 last = None # some time passes ... if last is not None: draw(last, current); last = current 5 last = None # some time passes ... if last is not None: draw(last, current); last = current 6 last = None # some time passes ... if last is not None: draw(last, current); last = current 7____28

    last = None
    
    # some time passes ...
    
    if last is not None:
        draw(last, current);
    last = current
    
    9
    # Variable 'last' may or may not be bound to a value at this point.
    
    try:
        last
    except NameError:
        last = None
    
    # It will always now be bound to a value at this point.
    
    if last is not None:
        draw(last, current);
    last = current
    
    0
    # Variable 'last' may or may not be bound to a value at this point.
    
    try:
        last
    except NameError:
        last = None
    
    # It will always now be bound to a value at this point.
    
    if last is not None:
        draw(last, current);
    last = current
    
    1

    Python3

    True
    8
    True
    9

    if last:
        draw(last, current);
    last = current
    
    9
    False
    1

    if last:
        draw(last, current);
    last = current
    
    9
    False
    3
    False
    4
    False
    5
    False
    6

    Phương pháp 2: Kiểm tra sự tồn tại của biến Globel

    if last:
        draw(last, current);
    last = current
    
    9
    False
    3
    False
    4
    Error: No value detected
    2
    False
    6

    Output:

    Để kiểm tra sự tồn tại của các biến trên toàn cầu, chúng tôi sẽ sử dụng hàm Globals () để có được từ điển của bảng biểu tượng toàn cầu hiện tại. & NBSP;

    Kiểm tra nếu một biến được xác định

    Tín dụng: Hamish Lawson

    Vấn đề

    Bạn muốn thực hiện các khóa học hành động khác nhau dựa trên việc một biến có được xác định hay không.

    Dung dịch

    Trong Python, tất cả các biến dự kiến ​​sẽ được xác định trước khi sử dụng. Đối tượng

    Error: No value detected
    4 là một giá trị bạn thường gán để biểu thị rằng bạn không có giá trị thực cho một biến, như trong:

    try: x
    except NameError: x = None

    Sau đó, nó dễ dàng kiểm tra xem một biến có bị ràng buộc với

    Error: No value detected
    4:

    if x is None:
        some_fallback_operation(  )
    else:
        some_operation(x)

    Thảo luận

    Python không có chức năng cụ thể để kiểm tra xem một biến có được xác định hay không, vì tất cả các biến dự kiến ​​đã được xác định trước khi sử dụng, ngay cả khi ban đầu được gán cho đối tượng

    Error: No value detected
    4. Cố gắng truy cập vào một biến đã được xác định trước đây sẽ tăng ngoại lệ
    Error: No value detected
    7 (mà bạn có thể xử lý với câu lệnh ________ 48/________ 57, vì bạn có thể cho bất kỳ ngoại lệ Python nào khác).

    Nó được coi là bất thường trong Python không biết liệu một biến đã được xác định. Nhưng nếu bạn vẫn còn trong tình huống này, bạn có thể đảm bảo rằng một biến nhất định trên thực tế được xác định (là

    Error: No value detected
    4, nếu không có gì khác) bằng cách cố gắng truy cập nó trong một điều khoản
    True
    8 và gán cho nó đối tượng
    Error: No value detected
    4 nếu truy cập tăng
    Error: No value detected
    7 ngoại lệ. Lưu ý rằng
    Error: No value detected
    4 thực sự không có gì kỳ diệu, chỉ là một đối tượng tích hợp được sử dụng bởi quy ước (và được trả về bởi các chức năng thoát mà không trả lại bất cứ điều gì cụ thể). Bạn có thể sử dụng bất kỳ giá trị nào khác phù hợp cho mục đích của mình để khởi tạo các biến không xác định; Để biết ví dụ mạnh mẽ và thú vị, xem Công thức 5.24.

    Thay vì đảm bảo rằng một biến được khởi tạo, bạn có thể thích kiểm tra xem nó có được xác định ở nơi bạn muốn sử dụng không:

    try: x
    except NameError: some_fallback_operation(  )
    else: some_operation(x)

    Đây là một sự thay thế hoàn toàn có thể chấp nhận được cho mã trong công thức, và một số người sẽ nói rằng nó có nhiều pythonic hơn. Tuy nhiên, lưu ý rằng nếu bạn chọn giải pháp thay thế này, bạn phải viết mã theo thứ tự này: trường hợp dị thường, lỗi trước, thì trường hợp bình thường, không lỗi. Với cách tiếp cận công thức, bạn có thể muốn đảo ngược điều kiện bảo vệ thành

    try: x
    except NameError: x = None
    5 và mã hóa trường hợp bình thường trước. Những điểm này là minutiae, để chắc chắn, nhưng đôi khi sự rõ ràng có thể được cải thiện theo cách này. Hơn nữa, bạn phải cẩn thận để tránh sự thay đổi trong phương án này:

    if last:
        draw(last, current);
    last = current
    
    0

    Trong biến thể này, cuộc gọi đến

    try: x
    except NameError: x = None
    6 cũng được bao phủ bởi trình xử lý ngoại lệ, vì vậy nếu có lỗi trong hàm
    try: x
    except NameError: x = None
    6 hoặc trong bất kỳ chức năng nào được gọi từ nó, mã này sẽ che dấu lỗi và dường như tiến hành hoạt động bình thường khi nó nên thất bại với một thông báo lỗi. Bạn phải luôn cẩn thận rằng các điều khoản
    True
    8 của bạn (trong các câu lệnh ____ 48/________ 57) không vô tình bao gồm nhiều mã hơn bạn thực sự có ý định bao gồm, điều này có thể dễ dàng che dấu lỗi. Điều khoản
    if x is None:
        some_fallback_operation(  )
    else:
        some_operation(x)
    1 trong câu lệnh ________ 48/________ 57 dành cho mã chỉ nên thực thi nếu không có ngoại lệ nào được nêu ra nhưng không nên được xử lý bởi người xử lý ngoại lệ, vì bạn không mong đợi các trường hợp ngoại lệ từ nó và muốn chẩn đoán vấn đề ngay lập tức nếu xảy ra.

    Nhiều tình huống mà bạn có thể nghĩ sẽ tự nhiên làm phát sinh các biến không xác định, chẳng hạn như xử lý các tệp cấu hình hoặc biểu mẫu web, được xử lý tốt hơn bằng cách sử dụng từ điển và thử nghiệm cho sự hiện diện của khóa (với phương pháp

    if x is None:
        some_fallback_operation(  )
    else:
        some_operation(x)
    4, ________ 48/____ 57 hoặc các phương pháp
    if x is None:
        some_fallback_operation(  )
    else:
        some_operation(x)
    7 hoặc
    if x is None:
        some_fallback_operation(  )
    else:
        some_operation(x)
    8 của các đối tượng từ điển). Ví dụ: thay vì xử lý tệp cấu hình người dùng theo cách này:

    if last:
        draw(last, current);
    last = current
    
    1

    làm như thế này:

    if last:
        draw(last, current);
    last = current
    
    2

    if x is None:
        some_fallback_operation(  )
    else:
        some_operation(x)
    9 yêu cầu Python 2.2, nhưng bạn có thể có được hiệu ứng tương tự trong các phiên bản Python trước đó bằng cách sử dụng
    try: x
    except NameError: some_fallback_operation(  )
    else: some_operation(x)
    0 thay thế. Sử dụng một từ điển được chỉ định rõ ràng cho
    try: x
    except NameError: some_fallback_operation(  )
    else: some_operation(x)
    1,
    try: x
    except NameError: some_fallback_operation(  )
    else: some_operation(x)
    2 và
    try: x
    except NameError: some_fallback_operation(  )
    else: some_operation(x)
    3 dù sao cũng được khuyến khích, để kiểm soát không gian tên của bạn. Một trong nhiều lợi ích của việc sử dụng một từ điển được chỉ định rõ ràng như vậy, như được hiển thị ở đây, bạn không cần phải lo lắng về các biến không xác định mà chỉ cần sử dụng phương thức Nếu chìa khóa không có trong từ điển.

    Nếu bạn biết chắc chắn rằng không gian tên nào là biến trong (nghĩa là, cụ thể là

    last = None
    
    # some time passes ...
    
    if last is not None:
        draw(last, current);
    last = current
    
    7 hoặc cụ thể
    True
    2), bạn cũng có thể sử dụng các phương thức như
    if x is None:
        some_fallback_operation(  )
    else:
        some_operation(x)
    4 hoặc
    if x is None:
        some_fallback_operation(  )
    else:
        some_operation(x)
    7 trên từ điển có liên quan. Tuy nhiên, các biến trong cả
    last = None
    
    # some time passes ...
    
    if last is not None:
        draw(last, current);
    last = current
    
    7 cũng như
    True
    2 có thể tồn tại (nhờ tính năng phạm vi lồng nhau là tùy chọn trong Python 2.1, nhưng luôn ở trong Python 2.2 trở lên). Ngoài ra, các thư mục không gian tên đặc biệt được trả lại bởi
    last = None
    
    # some time passes ...
    
    if last is not None:
        draw(last, current);
    last = current
    
    7 và
    True
    2 không phù hợp với các phương pháp đột biến như
    if x is None:
        some_fallback_operation(  )
    else:
        some_operation(x)
    8, do đó, bạn vẫn nên sắp xếp để sử dụng từ điển rõ ràng của riêng bạn thay vì không gian tên địa phương hoặc toàn cầu, bất cứ khi nào khả thi.