Biến lớp Python không được xác định

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

if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
8 là một giá trị mà 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 đó, thật dễ dàng để kiểm tra xem một biến có bị ràng buộc với

if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
8 hay không

if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]

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 phải được xác định trước khi sử dụng, ngay cả khi ban đầu được gán đối tượng

if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
8. Cố gắng truy cập vào một biến chưa được xác định trước đó sẽ tạo ra một ngoại lệ
if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
1 [bạn có thể xử lý bằng câu lệnh
if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
0/
if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
1, như bạn có thể làm với bất kỳ ngoại lệ Python nào khác]

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

if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
8, nếu không có gì khác] bằng cách cố gắng truy cập nó bên trong mệnh đề
if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
0 và gán cho nó đối tượng
if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
8 nếu việc truy cập làm tăng một
if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
1 . Lưu ý rằng
if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
8 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 theo quy ước [và được trả về bởi các hàm thoát mà không trả về bất kỳ thứ gì cụ thể]. Bạn có thể sử dụng bất kỳ giá trị nào khác phù hợp với mục đích của mình để khởi tạo các biến không xác định; . 24

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

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

Đây là một giải pháp thay thế hoàn toàn có thể chấp nhận được đối với mã trong công thức và một số người sẽ nói rằng nó giống 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ã mọi thứ theo thứ tự này. trường hợp bất thường, có lỗi trước, sau đó là trường hợp bình thường, không có lỗi. Với cách tiếp cận của 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à viết mã trường hợp bình thường trước. Chắc chắn những điểm này là chi tiết vụn vặt, 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, lệnh gọi tới

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ỳ hàm nào được gọi từ hàm đó, thì mã này sẽ che giấu lỗi đó và dường như sẽ tiếp tục hoạt động bình thường khi cần. . Bạn phải luôn cẩn thận rằng mệnh đề
if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
0 của bạn [trong câu lệnh
if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
0/
if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
1] không vô tình che nhiều mã hơn mức bạn thực sự dự định che, điều này có thể dễ dàng che giấu lỗi. Mệnh đề
try: x
except NameError: some_fallback_operation[  ]
else: some_operation[x]
3 trong câu lệnh
if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
0/
if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
1 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 bản thân nó không được bao phủ bởi trình xử lý ngoại lệ, bởi 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 ngoại lệ xảy ra

Nhiều tình huống mà bạn có thể nghĩ sẽ làm phát sinh các biến không xác định một cách tự nhiên, chẳng hạn như xử lý 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à kiểm tra 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,
if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
0/
if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
1 hoặc . Ví dụ: thay vì xử lý tệp cấu hình người dùng theo cách này

if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
1

làm như thế này

if x is None:
    some_fallback_operation[  ]
else:
    some_operation[x]
2

try:
    x
    some_operation[x]
except NameError:
    some_fallback_operation[  ]
1 yêu cầu Python 2. 2, nhưng bạn có thể nhận được hiệu ứng tương tự trong các phiên bản Python cũ hơn bằng cách sử dụng
try:
    x
    some_operation[x]
except NameError:
    some_fallback_operation[  ]
2 thay thế. Dù sao thì bạn cũng nên 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 để giữ cho không gian tên của bạn được kiểm soát. Một trong nhiều lợi ích của việc sử dụng từ điển được chỉ định rõ ràng như vậy, như được hiển thị ở đây, là bạn không cần phải lo lắng về các biến không xác định mà có thể 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 sẽ được sử dụng

Nếu bạn biết chắc biến đó nằm trong không gian tên nào [i. e. , cụ thể là

try:
    x
    some_operation[x]
except NameError:
    some_fallback_operation[  ]
7 hoặc cụ thể là
try:
    x
    some_operation[x]
except NameError:
    some_fallback_operation[  ]
8], bạn cũng có thể sử dụng các phương pháp 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 trong từ điển liên quan. Tuy nhiên, có thể tồn tại các biến không thuộc
try:
    x
    some_operation[x]
except NameError:
    some_fallback_operation[  ]
7 hoặc
try:
    x
    some_operation[x]
except NameError:
    some_fallback_operation[  ]
8 [nhờ tính năng phạm vi lồng nhau là tùy chọn trong Python 2. 1, nhưng luôn bật 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ả về 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 thức biến đổi như
try:
    x
    some_operation[x]
except NameError:
    some_fallback_operation[  ]
0, vì vậy, tốt hơn hết bạn nên sắp xếp để sử dụng từ điển rõ ràng của riêng mình thay vì các không gian tên cục bộ hoặc toàn cầu, bất cứ khi nào khả thi

Tại sao Python nói biến của tôi không được xác định?

Một số lỗi phổ biến gây ra lỗi này là. Sử dụng tên biến hoặc hàm chưa được xác định . Viết sai tên biến/hàm khi gọi biến/hàm. Sử dụng mô-đun Python mà không cần nhập mô-đun, v.v.

Bạn có thể định nghĩa một biến trong một lớp không?

Biến lớp là một phần quan trọng của lập trình hướng đối tượng [OOP] xác định thuộc tính hoặc thuộc tính cụ thể cho lớp và có thể được gọi là biến thành viên hoặc biến tĩnh. .

Lớp có thể là một biến trong Python không?

Các biến lớp được định nghĩa trong cấu trúc lớp . Bởi vì chúng được sở hữu bởi chính lớp, các biến lớp được chia sẻ bởi tất cả các phiên bản của lớp. Do đó, chúng thường sẽ có cùng giá trị cho mọi phiên bản trừ khi bạn đang sử dụng biến lớp để khởi tạo một biến.

Chủ Đề