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. Show
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:
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:
Trong trường hợp 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 3 cũng sẽ tăng một ngoại lệ. Một ý tưởng tốt hơn là đảm bảo 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ư:
Đ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ử 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 : Cải thiện bài viết Lưu bài viết Cải thiện bài viết Lưu bài viết Đọc Bàn luậnCá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;
Python3Phươ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; 7 8 9 0 1 2 2Output: 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 9 0 1Python3Phươ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; 0 1 2 9 0 1 2 2Output: 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 9 0 1Python3True8 True9 9False1 9False3 False4 False5 False6 Phương pháp 2: Kiểm tra sự tồn tại của biến Globel 9False3 False4 Error: No value detected2 False6 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 địnhTí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ịchTrong 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 detected4 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 detected4: if x is None: some_fallback_operation( ) else: some_operation(x) Thảo luậnPython 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 detected4. 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 detected7 (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 detected4, 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 True8 và gán cho nó đối tượng Error: No value detected4 nếu truy cập tăng Error: No value detected7 ngoại lệ. Lưu ý rằng Error: No value detected4 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 = None5 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: 0Trong biến thể này, cuộc gọi đến try: x except NameError: x = None6 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 = None6 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 True8 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: 1làm như thế này: 2if 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à 7 hoặc cụ thể True2), 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ả 7 cũng như True2 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 7 và True2 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. |