Hướng dẫn how do you check a variable in python? - làm thế nào để bạn kiểm tra một biến trong python?

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 None 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 None:

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 None. 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ệ NameError [mà bạn có thể xử lý với câu lệnh ____ 10/________ 11, 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à None, nếu không có gì khác] bằng cách cố gắng truy cập nó trong một mệnh đề

if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
0 và gán cho nó đối tượng None nếu truy cập tăng ngoại lệ. Lưu ý rằng None 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

if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
7 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:

try:
    x
    some_operation[x]
except NameError:
    some_fallback_operation[  ]

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

if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
8 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
if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
8 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
if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
0 của bạn [trong các câu lệnh ____ 10/________ 11] 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
try: x
except NameError: some_fallback_operation[  ]
else: some_operation[x]
3 trong câu lệnh ________ 10/________ 11 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 bảo vệ bởi người xử lý ngoại lệ, vì bạn không mong đợi các ngoại lệ từ nó và muốn chẩn đoán vấn đề ngay lập tức nếu các trường hợp ngoại lệ 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

try: x
except NameError: some_fallback_operation[  ]
else: some_operation[x]
6, ________ 10/________ 11 hoặc các phương pháp
try: x
except NameError: some_fallback_operation[  ]
else: some_operation[x]
9 hoặc
try:
    x
    some_operation[x]
except NameError:
    some_fallback_operation[  ]
0 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:

execfile['userconfig']
try: background_color
except NameError: background_color = 'black'
try: foreground_color
except NameError: foreground_color = 'white'
...

làm như thế này:

config = dict[globals[  ]]
execfile['userconfig', config]
background_color = config.get['background_color', 'black']
foreground_color = config.get['foreground_color', 'white']
...

try:
    x
    some_operation[x]
except NameError:
    some_fallback_operation[  ]
1 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
    some_operation[x]
except NameError:
    some_fallback_operation[  ]
2 thay thế. Sử dụng một từ điển được chỉ định rõ ràng cho
try:
    x
    some_operation[x]
except NameError:
    some_fallback_operation[  ]
3,
try:
    x
    some_operation[x]
except NameError:
    some_fallback_operation[  ]
4 và
try:
    x
    some_operation[x]
except NameError:
    some_fallback_operation[  ]
5 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
try: x
except NameError: some_fallback_operation[  ]
else: some_operation[x]
9 của từ điển để tìm nạp từng khóa với giá trị mặc định được chỉ định rõ ràng để được sử dụng 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à

try:
    x
    some_operation[x]
except NameError:
    some_fallback_operation[  ]
7 hoặc cụ thể
try:
    x
    some_operation[x]
except NameError:
    some_fallback_operation[  ]
8], bạn cũng có thể sử dụng các phương thức như
try: x
except NameError: some_fallback_operation[  ]
else: some_operation[x]
6 hoặc
try: x
except NameError: some_fallback_operation[  ]
else: some_operation[x]
9 trên từ điển có liên quan. Tuy nhiên, các biến trong cả
try:
    x
    some_operation[x]
except NameError:
    some_fallback_operation[  ]
7 cũng như
try:
    x
    some_operation[x]
except NameError:
    some_fallback_operation[  ]
8 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
try:
    x
    some_operation[x]
except NameError:
    some_fallback_operation[  ]
7 và
try:
    x
    some_operation[x]
except NameError:
    some_fallback_operation[  ]
8 không phù hợp với các phương pháp đột biến như
try:
    x
    some_operation[x]
except NameError:
    some_fallback_operation[  ]
0, 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.

Bài Viết Liên Quan

Chủ Đề