Làm thế nào để sử dụng câu lệnh pass?


392

Tôi đang trong quá trình học Python và tôi đã đạt được phần về passtuyên bố. Hướng dẫn tôi đang sử dụng định nghĩa nó là một Nulltuyên bố thường được sử dụng như một trình giữ chỗ.

Tôi vẫn không hoàn toàn hiểu điều đó có nghĩa là gì. Ai đó có thể chỉ cho tôi một tình huống đơn giản / cơ bản trong đó passcâu lệnh sẽ được sử dụng và tại sao nó lại cần thiết không?


4
Tôi chưa bao giờ cần phải làm điều này trong cuộc sống thực, nhưng tôi có thể cho rằng passsẽ hữu ích khi bạn muốn ghi đè một phương thức trong một lớp con để không làm gì cả.
kojiro

2
@kojiro, ví dụ đôi khi hữu ích khi thực hiện en.wikipedia.org/wiki/Skeleton_(computer_programming)
Franck Dernoncourt

1
Rất tiện dụng khi xử lý ngoại lệ. Đôi khi một ngoại lệ có nghĩa là một điều kiện bình thường chỉ cần một kiểu xử lý khác. Trong trường hợp đó passtrong exceptkhối đi kèm rất tiện dụng.
Nhà vật lý điên

Câu trả lời:


475

Giả sử bạn đang thiết kế một lớp mới với một số phương thức mà bạn chưa muốn thực hiện.

class MyClass(object):
    def meth_a(self):
        pass

    def meth_b(self):
        print "I'm meth_b"

Nếu bạn bỏ qua pass, mã sẽ không chạy.

Sau đó, bạn sẽ nhận được một:

IndentationError: expected an indented block

Tóm lại, passtuyên bố không có gì đặc biệt, nhưng nó có thể hoạt động như một trình giữ chỗ, như được trình bày ở đây.


22
Vâng, trong trường hợp này người ta cũng có thể sử dụng return, mặc dù với một chút mất rõ ràng.

38
Tôi thực sự không nghĩ rằng điều này trả lời đúng câu hỏi. Trích dẫn một cách sử dụng có thể cho một cái gì đó, ngay cả khi đó là cách sử dụng phổ biến nhất cho nó, không giống như giải thích nó dùng để làm gì.
Schilcote

5
@Schilcote: Tôi thấy quan điểm của bạn. Tôi đã thêm một lời giải thích ngắn cho câu trả lời ban đầu của tôi. Tuy nhiên, tôi nghĩ rằng một ví dụ đơn giản thường giúp hiểu một khái niệm nào đó.
sebastian_oe

3
Câu trả lời của @Anaphory, bên dưới, cho thấy tại sao đây là yếu tố ngôn ngữ quan trọng.
Giăng

2
Điều này giải thích cho một lần sử dụng pass, nhưng tôi vẫn không thực sự hiểu nó làm gì. Có sử dụng cho điều này trong mã sản xuất? Từ ví dụ của bạn, tôi sẽ chọn không thêm phương thức đó cho đến khi tôi sẵn sàng thực hiện nó, hoặc đơn giản là tôi sẽ làm return.
theStherSide

221

Python có yêu cầu cú pháp mã khối (sau khi if, except, def, classvv) có thể không được bỏ trống. Tuy nhiên, các khối mã rỗng rất hữu ích trong nhiều bối cảnh khác nhau, chẳng hạn như trong các ví dụ dưới đây, đây là những trường hợp sử dụng thường xuyên nhất mà tôi đã thấy.

Do đó, nếu không có gì được cho là xảy ra trong một khối mã, passthì một khối như vậy là không cần thiết để không tạo ra một khối IndentationError. Ngoài ra, có thể sử dụng bất kỳ câu lệnh nào (bao gồm chỉ một thuật ngữ được đánh giá, như Ellipsisnghĩa đen ...hoặc chuỗi, thường là một chuỗi), nhưng passrõ ràng rằng thực sự không có gì đáng lẽ phải xảy ra, và không cần phải thực sự được đánh giá và (ít nhất là tạm thời) được lưu trữ trong bộ nhớ.

  • Bỏ qua (tất cả hoặc) một loại Exception(ví dụ từ xml):

    try:
        self.version = "Expat %d.%d.%d" % expat.version_info
    except AttributeError:
        pass # unknown
    

    Lưu ý: Bỏ qua tất cả các loại tăng, như trong ví dụ sau pandas, thường được coi là thực tiễn xấu, bởi vì nó cũng bắt được các ngoại lệ có thể được chuyển cho người gọi, ví dụ KeyboardInterrupthoặc SystemExit(hoặc thậm chí HardwareIsOnFireError- Làm sao bạn biết bạn không chạy trên hộp tùy chỉnh với các lỗi cụ thể được xác định, mà một số ứng dụng gọi điện muốn biết về?).

    try:
        os.unlink(filename_larry)
    except:
        pass
    

    Thay vào đó sử dụng ít nhất except Error:hoặc trong trường hợp này tốt nhất except OSError:được coi là thực hành tốt hơn nhiều. Một phân tích nhanh về tất cả các mô-đun python tôi đã cài đặt cho tôi rằng hơn 10% tất cả các except ...: passcâu lệnh bắt được tất cả các ngoại lệ, vì vậy đây vẫn là một mô hình thường xuyên trong lập trình python.

  • Xuất phát một lớp ngoại lệ không thêm hành vi mới (ví dụ: trong scipy):

    class CompileError(Exception):
        pass
    

    Tương tự, các lớp dự định là lớp cơ sở trừu tượng thường có một __init__phương thức trống rõ ràng hoặc các phương thức khác mà các lớp con được cho là xuất phát. (ví dụ pebl)

    class _BaseSubmittingController(_BaseController):
        def submit(self, tasks): pass
        def retrieve(self, deferred_results): pass
    
  • Kiểm tra mã đó chạy đúng cho một vài giá trị thử nghiệm mà không cần quan tâm đến kết quả (từ mpmath):

    for x, error in MDNewton(mp, f, (1,-2), verbose=0,
                             norm=lambda x: norm(x, inf)):
        pass
    
  • Trong các định nghĩa lớp hoặc hàm, thường thì một chuỗi doc đã được đặt dưới dạng câu lệnh bắt buộc phải được thực thi như là điều duy nhất trong khối. Trong những trường hợp như vậy, khối có thể chứa pass bên cạnh chuỗi doc để nói ra điều này Thực sự không có ý định làm gì. Ví dụ như trong pebl:

    class ParsingError(Exception): 
        """Error encountered while parsing an ill-formed datafile."""
        pass
    
  • Trong một số trường hợp, passđược sử dụng như một giữ chỗ để nói “phương pháp / lớp / nếu khối này / ... đã chưa thực hiện được, nhưng điều này sẽ là nơi để làm điều đó”, mặc dù cá nhân tôi thích Ellipsistheo nghĩa đen ...để phân biệt nghiêm ngặt giữa điều này và sự cố ý không có ý định trong ví dụ trước. ( Lưu ý rằng nghĩa đen của Ellipsis là một biểu thức hợp lệ chỉ có trong Python 3 )
    Ví dụ: nếu tôi viết một mô hình theo các nét rộng, tôi có thể viết

    def update_agent(agent):
        ... 
    

    nơi những người khác có thể có

    def update_agent(agent):
        pass
    

    trước

    def time_step(agents):
        for agent in agents:
            update_agent(agent)
    

    như một lời nhắc để điền vào update_agenthàm sau, nhưng hãy chạy một số thử nghiệm để xem phần còn lại của mã có hoạt động như dự định không. (Một lựa chọn thứ ba cho trường hợp này là raise NotImplementedErrornày rất hữu ích đặc biệt đối với hai trường hợp:. Hoặc là “phương pháp trừu tượng này nên được thực hiện bởi tất cả các lớp con, không có cách nào tổng quát để xác định nó trong lớp cơ sở này” , hay “chức năng này, với Tên này chưa được triển khai trong bản phát hành này, nhưng đây là chữ ký của nó sẽ trông giống như )


Đây là một câu trả lời tốt hơn nhiều!
rjoxford

22

Bên cạnh việc sử dụng nó như một trình giữ chỗ cho các chức năng chưa được thực hiện, passcó thể hữu ích trong việc điền vào một câu lệnh if-other ("Rõ ràng là tốt hơn so với ẩn.")

def some_silly_transform(n):
    # Even numbers should be divided by 2
    if n % 2 == 0:
        n /= 2
        flag = True
    # Negative odd numbers should return their absolute value
    elif n < 0:
        n = -n
        flag = True
    # Otherwise, number should remain unchanged
    else:
        pass

Tất nhiên, trong trường hợp này, người ta có thể sẽ sử dụng returnthay vì gán, nhưng trong trường hợp mong muốn đột biến, điều này hoạt động tốt nhất.

Việc sử dụng passở đây đặc biệt hữu ích để cảnh báo những người duy trì trong tương lai (bao gồm cả chính bạn!) Không được đặt các bước dư thừa bên ngoài các tuyên bố có điều kiện. Trong ví dụ trên, flagđược đặt trong hai trường hợp được đề cập cụ thể, nhưng không phải trong trường hợp else. Nếu không sử dụng pass, một lập trình viên tương lai có thể chuyển flag = Truesang bên ngoài điều kiện, do đó thiết lập flagtrong mọi trường hợp.


Một trường hợp khác là với chức năng soạn sẵn thường thấy ở dưới cùng của tệp:

if __name__ == "__main__":
    pass

Trong một số tệp, có thể tốt hơn là để lại ở đó passđể cho phép chỉnh sửa dễ dàng hơn sau đó và để làm rõ rằng không có gì được dự kiến ​​sẽ xảy ra khi tệp tự chạy.


Cuối cùng, như đã đề cập trong các câu trả lời khác, có thể hữu ích khi không làm gì khi ngoại lệ bị bắt:

try:
    n[i] = 0
except IndexError:
    pass

2
Tôi nghĩ rằng hai ví dụ đầu tiên nói chung là thực hành xấu. Về ví dụ đầu tiên, bạn nên đặt flag = Falsetrước if ... elif khối để tránh lỗi "NameError: tên 'cờ' không được xác định" sau này. Về ví dụ thứ hai, có vẻ như bizzar phải thêm if __name__ == "__main__": passvào phần lớn các tệp Python không thực hiện bất kỳ khi nào được thực thi trực tiếp (đó là trường hợp khi bạn đang viết mã mô-đun). Với Python> = 3.0, bạn nên sử dụng ...(Ellipsis) thay vì passchỉ ra các khối "kết thúc sau".
Ostrokach

18

Cách tốt nhất và chính xác nhất để suy nghĩ passlà một cách rõ ràng để nói với người phiên dịch không làm gì cả. Theo cùng một cách mã sau đây:

def foo(x,y):
    return x+y

có nghĩa là "nếu tôi gọi hàm foo (x, y), tính tổng hai số mà nhãn x và y đại diện và trao lại kết quả",

def bar():
    pass

có nghĩa là "Nếu tôi gọi thanh chức năng (), hoàn toàn không làm gì cả."

Các câu trả lời khác khá chính xác, nhưng nó cũng hữu ích cho một số điều không liên quan đến việc giữ chỗ.

Ví dụ, trong một chút mã mà tôi đã làm việc gần đây, cần phải chia hai biến và số chia có thể bằng 0.

c = a / b

rõ ràng sẽ tạo ra ZeroDivisionError nếu b bằng không. Trong tình huống cụ thể này, để c là 0 là hành vi mong muốn trong trường hợp b bằng 0, vì vậy tôi đã sử dụng mã sau:

try:
    c = a / b
except ZeroDivisionError:
    pass

Một cách sử dụng khác, ít tiêu chuẩn hơn là một nơi thuận tiện để đặt điểm dừng cho trình gỡ lỗi của bạn. Ví dụ, tôi muốn một chút mã để đột nhập vào trình gỡ lỗi trong lần lặp thứ 20 của một câu lệnh for ... trong câu lệnh. Vì thế:

for t in range(25):
    do_a_thing(t)
    if t == 20:
        pass

với điểm dừng trên đường chuyền.


def bar(): passkhông làm "hoàn toàn không có gì". Nó vẫn trở về None, ngấm ngầm.
chepner

1
Quan điểm của bạn về trình gỡ lỗi thường bị bỏ qua nhưng là một điểm quan trọng. +1
Wtower

10

Một trường hợp sử dụng phổ biến trong đó nó có thể được sử dụng 'như hiện tại' là ghi đè một lớp chỉ để tạo một loại (khác với siêu lớp), vd

class Error(Exception):
    pass

Vì vậy, bạn có thể nâng cao và bắt Errorngoại lệ. Điều quan trọng ở đây là loại ngoại lệ, hơn là nội dung.


6

passtrong Python về cơ bản không làm gì cả, nhưng không giống như một nhận xét, nó không bị bỏ qua bởi trình thông dịch. Vì vậy, bạn có thể tận dụng lợi thế của nó ở nhiều nơi bằng cách biến nó thành nơi giữ chỗ:

1: Có thể được sử dụng trong lớp

   class TestClass: 
      pass

2: Có thể được sử dụng trong các câu lệnh lặp và điều kiện:

   if (something == true):  # used in conditional statement
       pass

   while (some condition is true):  # user is not sure about the body of the loop
       pass

3: Có thể được sử dụng trong chức năng:

   def testFunction(args): # programmer wants to implement the body of the function later
       pass

passđược sử dụng chủ yếu khi lập trình viên không muốn đưa ra triển khai vào lúc này nhưng vẫn muốn tạo một câu lệnh lớp / hàm / điều kiện nhất định có thể được sử dụng sau này. Vì trình thông dịch Python không cho phép bỏ trống hoặc chưa thực hiện lớp / hàm / câu lệnh điều kiện, nó sẽ báo lỗi:

IndentationError: dự kiến ​​một khối thụt lề

pass có thể được sử dụng trong các kịch bản như vậy.


5

Bạn có thể nói rằng pass có nghĩa là hoạt động NOP (Không hoạt động). Bạn sẽ có một hình ảnh rõ ràng sau ví dụ này: -

Chương trình C

#include<stdio.h>

void main()
{
    int age = 12;

    if( age < 18 )
    {
         printf("You are not adult, so you can't do that task ");
    }
    else if( age >= 18 && age < 60)
    {
        // I will add more code later inside it 
    }
    else
    {
         printf("You are too old to do anything , sorry ");
    }
}

Bây giờ bạn sẽ viết nó như thế nào trong Python: -

age = 12

if age < 18:

    print "You are not adult, so you can't do that task"

elif age >= 18 and age < 60:

else:

    print "You are too old to do anything , sorry "

Nhưng mã của bạn sẽ báo lỗi vì nó yêu cầu một khối thụt vào sau elif . Đây là vai trò của từ khóa pass .

age = 12

if age < 18:

    print "You are not adult, so you can't do that task"

elif age >= 18 and age < 60:

    pass

else:

    print "You are too old to do anything , sorry "

Bây giờ tôi nghĩ rằng nó rõ ràng với bạn.


1
&&Toán tử không tồn tại trong Python
Iván C.

5

Tôi thích sử dụng nó khi khai thác các bài kiểm tra. Tôi thường xuyên nhận thức được những gì tôi muốn kiểm tra nhưng không biết làm thế nào để làm điều đó. Ví dụ thử nghiệm trông giống như những gì sebastian_oe đề xuất

class TestFunctions(unittest.TestCase):

   def test_some_feature(self):
      pass

   def test_some_other_feature(self):
      pass

Tôi thực sự khuyên KHÔNG nên làm điều này, bạn có thể dễ dàng quên đi bài kiểm tra trống như vậy! tốt hơn để bỏ các bài kiểm tra với các mã ngắn luôn thất bại, ví dụ assert Falsehoặc assert 0theo cách này bạn sẽ luôn được lưu ý, bạn nên thêm một triển khai :)
jave.web

4

Các tuyên bố vượt qua không làm gì. Nó có thể được sử dụng khi một câu lệnh được yêu cầu về mặt cú pháp nhưng chương trình không yêu cầu hành động.


4

Thành thật mà nói, tôi nghĩ rằng các tài liệu Python chính thức mô tả nó khá tốt và cung cấp một số ví dụ:

Các tuyên bố vượt qua không làm gì. Nó có thể được sử dụng khi một câu lệnh được yêu cầu về mặt cú pháp nhưng chương trình không yêu cầu hành động. Ví dụ:

>>> while True: ... pass # Busy-wait for keyboard interrupt (Ctrl+C) ...

Điều này thường được sử dụng để tạo các lớp tối thiểu:

>>> class MyEmptyClass: ... pass ...

Một nơi khác qua có thể được sử dụng như một nơi-giữ cho một chức năng hoặc cơ thể có điều kiện khi bạn đang làm việc trên mã mới, cho phép bạn giữ suy nghĩ ở mức trừu tượng hơn. Các đường chuyền đang âm thầm bỏ qua:

>>> def initlog(*args): ... pass # Remember to implement this! ...


0

như cuốn sách đã nói, tôi chỉ sử dụng nó như một trình giữ chỗ tạm thời, tức là

# code that does something to to a variable, var
if var == 2000:
    pass
else:
    var += 1

và sau đó điền vào kịch bản trong đó var == 2000


3
bạn đang nói về cuốn sách nào

xin lỗi ... hướng dẫn, mà OP đề cập
Cameron Sparr

0

Pass có nghĩa là bỏ qua .... đơn giản như nó là .... nếu điều kiện đã cho là đúng và câu lệnh tiếp theo được thông qua, nó bỏ qua giá trị hoặc lần lặp đó và chuyển sang dòng tiếp theo ..... Ví dụ

For i in range (1,100):
    If i%2==0:
                  Pass 
    Else:
                  Print(i)

Đầu ra: In tất cả các số lẻ từ 1-100

Điều này là do mô đun của số chẵn bằng 0, do đó nó bỏ qua số này và chuyển sang số tiếp theo, vì mô đun số lẻ không bằng 0, phần khác của vòng lặp được thực thi và được in


Tôi nhận được một SyntaxError. Ngoài ra, đây không phải là cách sử dụng tốt passvì bạn có thể làm một cách đơn giảnfor i in range(1,100):print(i)if i%2else""
MilkyWay90

-1

Đây là một ví dụ khi tôi trích xuất dữ liệu cụ thể từ danh sách có nhiều loại dữ liệu (đó là cách tôi gọi nó trong R-- xin lỗi nếu đó là danh pháp sai) và tôi chỉ muốn trích xuất dữ liệu số nguyên / số và KHÔNG .

Dữ liệu trông giống như:

>>> a = ['1', 'env', '2', 'gag', '1.234', 'nef']
>>> data = []
>>> type(a)
<class 'list'>
>>> type(a[1])
<class 'str'>
>>> type(a[0])
<class 'str'>

Tôi muốn xóa tất cả các ký tự theo thứ tự chữ cái, vì vậy tôi đã cho máy thực hiện bằng cách đặt lại dữ liệu và "chuyển" qua dữ liệu theo thứ tự bảng chữ cái:

a = ['1', 'env', '2', 'gag', '1.234', 'nef']
data = []
for i in range(0, len(a)):
    if a[i].isalpha():
        pass
    else:
        data.append(a[i])
print(data)
['1', '2', '1.234']

-1

Câu lệnh pass trong Python được sử dụng khi một câu lệnh được yêu cầu về mặt cú pháp nhưng bạn không muốn bất kỳ lệnh hoặc mã nào được thực thi.

Câu lệnh pass là một hoạt động null; Không có gì xảy ra khi nó thực thi. Pass cũng hữu ích ở những nơi cuối cùng mã của bạn sẽ đi, nhưng chưa được viết (ví dụ: trong các cuống chẳng hạn):

`Ví dụ:

#!/usr/bin/python

for letter in 'Python': 
   if letter == 'h':
      pass
      print 'This is pass block'
   print 'Current Letter :', letter

print "Good bye!"

Điều này sẽ tạo ra kết quả sau:

Current Letter : P
Current Letter : y
Current Letter : t
This is pass block
Current Letter : h
Current Letter : o
Current Letter : n
Good bye!

Mã trước không thực thi bất kỳ câu lệnh hoặc mã nào nếu giá trị của chữ cái là 'h'. Câu lệnh pass rất hữu ích khi bạn đã tạo một khối mã nhưng nó không còn cần thiết nữa.

Sau đó, bạn có thể xóa các câu lệnh bên trong khối nhưng để khối còn lại với câu lệnh vượt qua để nó không can thiệp vào các phần khác của mã.


-1

pass được sử dụng để tránh lỗi thụt lề trong python Nếu chúng ta sử dụng các ngôn ngữ như c, c ++, java thì chúng có dấu ngoặc nhọn như

 if(i==0)
 {}
 else
 {//some code}

Nhưng trong python nó đã sử dụng thụt đầu dòng thay vì niềng răng để tránh những lỗi như vậy chúng tôi sử dụng pass. Nhớ khi bạn đang chơi một bài kiểm tra và

 if(dont_know_the_answer)
      pass

Chương trình ví dụ,

  for letter in 'geeksforgeeks':
        pass
  print 'Last Letter :', letter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.