Cho một đối tượng, nhiệm vụ là kiểm tra xem đối tượng đó có phải là danh sách hay không. Phương pháp số 1. Sử dụng isinstance Python3
your object is a list your object is not a list0_______0_______1_______0_______2 your object is a list your object is not a list1 your object is a list your object is not a list4 your object is a list your object is not a list1 your object is a list your object is not a list6 your object is a list your object is not a list1 your object is a list your object is not a list8 your object is a list your object is not a list9 Trong Python, tất cả các biến phải được xác định trước khi sử dụng. Đối tượng 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) 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 đều 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)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)0 và gán cho nó đối tượng None nếu việc truy cập làm tăng NameError . 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 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; . 24Thay 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 hàm 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 để mệnh đề if x is None: some_fallback_operation( ) else: some_operation(x)0 của mình (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ự đị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 đưa 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ể cho rằng 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, phương thức 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 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ể 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 đi nữa, bạn 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 để 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, 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 một 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ác biến không phải là try: x some_operation(x) except NameError: some_fallback_operation( )7 hay 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 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 |