암호문을 사용하는 방법?


392

저는 파이썬을 배우는 과정에 있으며 pass진술 에 관한 섹션에 도달했습니다 . 내가 사용하는 가이드 Null는 일반적으로 자리 표시 자로 사용되는 설명문 으로 정의합니다 .

그래도 그 의미를 완전히 이해하지 못합니다. 누군가가 pass진술이 사용될 간단한 / 기본 상황 과 왜 필요한지를 보여줄 수 있습니까 ?


4
실생활 에서이 작업을 수행 할 필요는 없었지만 pass서브 클래스의 메소드를 재정 의하여 아무것도하지 않으려는 경우 유용 할 것이라고 생각할 수 있습니다.
kojiro


1
예외를 처리 할 때 매우 편리합니다. 때로는 예외는 다른 유형의 처리가 필요한 정상적인 조건을 의미합니다. 이 경우 pass에서 except블록 매우 유용합니다.
Mad Physicist

답변:


474

아직 구현하고 싶지 않은 메소드를 사용하여 새 클래스를 설계한다고 가정하십시오.

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

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

를 생략 pass하면 코드가 실행되지 않습니다.

그러면 다음을 얻습니다.

IndentationError: expected an indented block

요약하면,이 pass진술은 특별한 것은 아니지만 여기에 설명 된 것처럼 자리 표시 자 역할을 할 수 있습니다.


22
글쎄,이 경우 return약간의 선명도가 떨어지지 만을 사용할 수 있습니다 .

38
나는 이것이 이것이 질문에 올바르게 대답한다고 생각하지 않습니다. 가장 일반적인 용도라도 무언가에 대해 한 가지 가능한 용도를 인용하는 것은 그 용도가 무엇인지 설명하는 것과 다릅니다.
Schilcote

5
@Schilcote : 당신의 요점을 참조하십시오. 초기 답변에 또 다른 간단한 설명을 추가했습니다. 그러나 간단한 예는 종종 특정 개념을 이해하는 데 도움이된다고 생각합니다.
sebastian_oe

3
아래 @Anaphory의 대답은 이것이 왜 중요한 언어 요소인지 보여줍니다.
John

2
이것은의 한 가지 사용법을 설명 pass하지만 여전히 그 기능을 이해하지 못합니다. 프로덕션 코드에서 이것을 사용합니까? 귀하의 예에서, 구현 할 준비가 될 때까지 해당 메소드를 추가하지 않거나 단순히 수행하려고 return합니다.
TheUtherSide

221

파이썬은 코드 블록 (후 그 구문 요구 사항이 if, except, def, class등) 비워 둘 수 없습니다 수 있습니다. 그러나 빈 코드 블록은 내가 본 가장 빈번한 사용 사례 인 아래 예제와 같이 다양한 컨텍스트에서 유용합니다.

따라서 코드 블록에서 아무 것도 발생 pass하지 않으면 이러한 블록에을 생성하지 않으려면 a 가 필요합니다 IndentationError. 또는 모든 문 ( Ellipsis리터럴 ...또는 문자열 과 같이 평가할 용어 포함 , 대부분은 docstring)을 사용할 수 있지만 pass실제로는 아무 일도 일어나지 않아야하며 실제로 평가할 필요가 없으며 (적어도 일시적으로) 메모리에 저장됩니다.

  • (전부 또는)의 특정 유형 무시 Exception(의 예를 xml)

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

    참고 : 에서 다음 예제와 같이 인상의 모든 유형을 무시 pandas그것도 아마 호출자에게 전달해야한다 예외, 예를 잡는다 때문에, 일반적으로 생각된다 나쁜 관행 KeyboardInterrupt또는 SystemExit(또는 HardwareIsOnFireError- 당신은 어떻게 당신이하지 알 수 있습니까 특정 오류가 정의 된 사용자 정의 상자에서 실행 중입니다. 일부 호출 응용 프로그램은 알고 싶습니다.).

    try:
        os.unlink(filename_larry)
    except:
        pass

    대신에 except Error:또는 적어도이 경우에 사용하는 것이 except OSError:훨씬 더 나은 방법으로 간주된다. 내가 설치 한 모든 파이썬 모듈에 대한 빠른 분석으로 모든 except ...: pass문장 의 10 % 이상이 모든 예외를 포착하므로 파이썬 프로그래밍에서 여전히 빈번한 패턴입니다.

  • 새 동작을 추가하지 않는 예외 클래스 파생 (예 :) scipy:

    class CompileError(Exception):
        pass

    마찬가지로, 추상 기본 클래스로 의도 된 클래스에는 종종 명시 적으로 비어 __init__있거나 서브 클래스가 파생해야하는 다른 메소드가 있습니다. (예를 들어 pebl)

    class _BaseSubmittingController(_BaseController):
        def submit(self, tasks): pass
        def retrieve(self, deferred_results): pass
  • 해당 코드를 테스트하면 (에서 나온 mpmath) 결과에 신경 쓰지 않고 몇 가지 테스트 값에 대해 올바르게 실행됩니다 .

    for x, error in MDNewton(mp, f, (1,-2), verbose=0,
                             norm=lambda x: norm(x, inf)):
        pass
  • 클래스 또는 함수 정의에서 종종 docstring이 블록의 유일한 것으로 실행되어야 하는 필수 명령문 으로 이미 존재 합니다. 그러한 경우, 블록은 "이것은 실제로 아무 것도하려는 의도가 없다"고 말하기 위해 docstring pass 과 함께 포함될 수 있습니다 pebl.

    class ParsingError(Exception): 
        """Error encountered while parsing an ill-formed datafile."""
        pass
  • 어떤 경우에는, pass제가 개인적으로 좋아하지만, 말을 자리 표시 자로 사용 "이 방법 / 클래스 / IF 블록이 / ... 아직 구현되지 않았지만이 할 수있는 장소가 될 것" Ellipsis문자를 ...하기 위해 이 예와 이전 예에서 의도적 인 "no-op"를 엄격하게 구분합니다. ( Ellipsis 리터럴은 Python 3에서만 유효한 표현식입니다. )
    예를 들어, 넓은 스트로크로 모델을 작성하면

    def update_agent(agent):
        ... 

    다른 사람들이 가질 수있는 곳

    def update_agent(agent):
        pass

    전에

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

    update_agent나중에 함수 를 작성하라는 알림으로 , 나머지 코드가 의도 한대로 작동하는지 확인하기 위해 이미 일부 테스트를 실행하십시오. (이 경우의 세 번째 옵션은 raise NotImplementedError. 특히 두 가지 경우에 유용합니다. "이 추상 메소드는 모든 서브 클래스에 의해 구현되어야합니다.이 기본 클래스에서이를 정의하는 일반적인 방법은 없습니다" 또는 " 이 이름은 아직이 릴리스에서 구현되지 않았지만 서명 방식은 다음과 같습니다.” )


이것은 훨씬 더 나은 대답입니다!
rjoxford

22

구현되지 않은 함수의 자리 표시 자로 사용하는 것 외에도 passif-else 문을 작성하는 데 유용 할 수 있습니다 ( "명시 적 의미는 암시 적보다 낫습니다").

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

물론,이 경우 return할당 대신에 사용 하지만, 돌연변이가 필요한 경우에는 이것이 가장 효과적입니다.

pass여기를 사용하면 미래의 유지 관리 담당자 (자신 포함)에게 조건문 외부에 중복 단계를 두지 않도록 경고하는 데 특히 유용합니다. 위의 예 flag에서, 구체적으로 언급 된 두 경우에 설정되지만 else-case 에는 설정되지 않습니다 . 사용하지 않고 pass, 미래의 프로그래머는 이동할 수있는 flag = True외부 조건 - 따라서 설정 flag에서 모든 사건을.


또 다른 경우는 파일의 맨 아래에 자주 상용구 기능이있는 경우입니다.

if __name__ == "__main__":
    pass

일부 파일의 경우 pass나중에 쉽게 편집하고 파일을 자체적으로 실행할 때 아무 일도 일어나지 않을 것임을 명시하기 위해 남겨 두는 것이 좋습니다 .


마지막으로 다른 답변에서 언급했듯이 예외가 발생했을 때 아무것도하지 않는 것이 좋습니다.

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

2
처음 두 예제는 일반적으로 나쁜 습관이라고 생각합니다. 첫 번째 예와 관련하여 나중에 "NameError : name 'flag'is not defined"오류가 모호해지지 않도록 블록 flag = False앞에 설정 해야합니다 if ... elif . 두 번째 예제와 관련하여 if __name__ == "__main__": pass직접 실행할 때 아무 것도하지 않는 대다수의 Python 파일 에 추가 해야하는 것은 bizzar처럼 보입니다 (모듈 코드를 작성할 때). Python> = 3.0에서는 "나중에 완료"블록을 표시하는 ...대신 (줄임표) 를 사용해야합니다 pass.
ostrokach 2016 년

18

생각하는 가장 정확하고 가장 정확한 방법 pass은 통역사에게 아무것도하지 말라고 명시 적으로 지시하는 방법입니다. 같은 방법으로 다음 코드를 :

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

"기능 foo (x, y)를 호출하면 레이블 x와 y가 나타내는 두 숫자를 합한 다음 결과를 되돌려줍니다",

def bar():
    pass

"함수 bar ()를 호출하면 아무 것도하지 마십시오."

다른 답변은 매우 정확하지만 자리 표시와 관련이없는 몇 가지 경우에도 유용합니다.

예를 들어, 최근에 작업 한 약간의 코드에서 두 변수를 나눌 필요가 있었고 제수가 0 일 수있었습니다.

c = a / b

b가 0이면 분명히 ZeroDivisionError가 발생합니다. 이 특정 상황에서 b가 0 인 경우 c를 0으로 두는 것이 바람직한 동작이므로 다음 코드를 사용했습니다.

try:
    c = a / b
except ZeroDivisionError:
    pass

덜 표준적인 또 다른 사용법은 디버거에 중단 점을 배치하기에 편리한 장소입니다. 예를 들어, for ... in 문의 20 번째 반복에서 디버거로 들어가는 약간의 코드가 필요했습니다. 그래서:

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

중단 점을 통과시킵니다.


def bar(): pass"절대적으로 아무것도"하지 않습니다. 여전히 None암시 적으로 반환합니다 .
chepner

1
디버거에 관한 요점은 종종 간과되지만 중요한 것입니다. +1
Wtower

10

'있는 그대로'사용될 수있는 일반적인 유스 케이스는 유형을 작성하기 위해 클래스를 대체하는 것입니다 (예 : 수퍼 클래스와 동일).

class Error(Exception):
    pass

따라서 Error예외를 발생 시키고 포착 할 수 있습니다 . 여기서 중요한 것은 내용이 아니라 예외 유형입니다.


6

pass파이썬에서는 기본적으로 아무것도하지 않지만 주석과 달리 해석기는 무시하지 않습니다. 따라서 자리 표시자를 만들어서 여러 곳에서 활용할 수 있습니다.

1 : 수업에서 사용 가능

   class TestClass: 
      pass

2 : 루프 및 조건문에 사용할 수 있습니다.

   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 : 기능에서 사용될 수 있습니다 :

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

pass프로그래머가 현재 구현을 원하지는 않지만 나중에 사용할 수있는 특정 클래스 / 함수 / 조건문을 작성하려고 할 때 주로 사용됩니다. 파이썬 인터프리터는 공백 또는 구현되지 않은 클래스 / 함수 / 조건문을 허용하지 않으므로 오류가 발생합니다.

IndentationError : 들여 쓰기 블록이 예상되었습니다.

pass 이러한 시나리오에서 사용할 수 있습니다.


5

passNOP (No Operation) 작업을 의미 한다고 말할 수 있습니다 . 이 예제 후에 명확한 그림을 얻을 수 있습니다 :-

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 ");
    }
}

이제 어떻게 파이썬으로 작성합니까 :-

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 "

그러나 elif 뒤에 들여 쓰기 블록이 필요했기 때문에 코드에 오류가 발생합니다 . 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 "

이제 나는 당신에게 분명하다고 생각합니다.


1
&&파이썬에는 연산자가 없습니다
Iván C.

5

테스트를 스텁 아웃 할 때 사용하고 싶습니다. 나는 종종 테스트하고 싶은 것을 알고 있지만 어떻게 해야할지 잘 모른다. 테스트 예제는 sebastian_oe가 제안한 것과 같습니다.

class TestFunctions(unittest.TestCase):

   def test_some_feature(self):
      pass

   def test_some_other_feature(self):
      pass

나는 그런 빈 테스트에 대해 쉽게 잊을 수 있는 이것을하지 않는 것이 좋습니다 ! 항상 실패하는 짧은 코드를 사용하여 테스트를 스텁하는 것이 좋습니다. 예를 들어 assert False, assert 0이렇게 하면 항상 구현을 추가해야합니다.
jave.web

4

pass 문은 아무 것도하지 않습니다. 명령문이 구문 적으로 필요하지만 프로그램에 조치가 필요하지 않은 경우 사용할 수 있습니다.


4

솔직히 공식적인 파이썬 문서 는 그것을 잘 설명하고 몇 가지 예를 제공 한다고 생각합니다 .

패스 문은 아무것도하지 않습니다. 명령문이 구문 상 필요하지만 프로그램에 조치가 필요하지 않을 때 사용할 수 있습니다. 예를 들면 다음과 같습니다.

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

이것은 일반적으로 최소 클래스를 만드는 데 사용됩니다.

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

새 코드를 작업 할 때 함수 또는 조건부 본문의 자리 표시 자로 사용할 수있는 또 다른 장소 패스 를 사용하여보다 추상적 인 수준으로 계속 생각할 수 있습니다. 패스는 자동으로 무시됩니다 :

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


0

책에서 말했듯이 나는 단지 임시 자리 표시 자로 만 사용합니다.

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

나중에 시나리오를 작성하십시오. var == 2000


3
무슨 책이야?

죄송합니다 ... 가이드, OP가 언급했습니다
Cameron Sparr

0

주어진 조건이 참이고 다음 명령문이 전달되면 전달은 해당 값 또는 반복을 무시하고 다음 행으로 진행합니다.

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

출력 : 1-100의 모든 홀수를 인쇄합니다

짝수의 모듈러스가 0과 같기 때문에 홀수의 모듈러스가 0이 아니기 때문에 숫자를 무시하고 다음 숫자로 진행하기 때문에 루프의 다른 부분이 실행되고 인쇄됩니다.


나는을 얻는다 SyntaxError. 또한, 이것은 pass당신이 간단하게 할 수 있기 때문에 잘 사용되지 않습니다for i in range(1,100):print(i)if i%2else""
MilkyWay90

-1

다음은 여러 데이터 유형이있는 목록에서 특정 데이터를 추출하는 예입니다 (R에서 호출하는 것입니다-잘못된 명명법 인 경우 미안합니다). 정수 / 숫자 및 NOT 문자 데이터 만 추출하고 싶었습니다. .

데이터는 다음과 같습니다.

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

나는 모든 알파벳 문자를 제거하고 싶었 기 때문에 데이터를 서브 셋팅하고 알파벳 데이터를 "통과"함으로써 머신이 처리하도록했다.

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

구문이 구문 적으로 필요하지만 명령이나 코드를 실행하지 않으려는 경우 Python의 pass 문이 사용됩니다.

pass 문은 null 연산입니다. 실행될 때 아무 일도 일어나지 않습니다. 이 패스는 코드가 최종적으로 작성되지만 아직 작성되지 않은 장소에서도 유용합니다 (예 : 스텁).

`예 :

#!/usr/bin/python

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

print "Good bye!"

결과는 다음과 같습니다.

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

문자 값이 'h'인 경우 앞의 코드는 명령문이나 코드를 실행하지 않습니다. pass 문은 코드 블록을 만들 때 유용하지만 더 이상 필요하지 않습니다.

그런 다음 블록 내부의 명령문을 제거 할 수 있지만 블록이 코드의 다른 부분을 방해하지 않도록 패스 명령문을 유지하도록 할 수 있습니다.


-1

파이썬에서 들여 쓰기 오류를 피하기 위해 pass가 사용됩니다. c, c ++, java와 같은 언어를 사용하면

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

그러나 파이썬에서는 중괄호 대신 들여 쓰기를 사용 했으므로 이러한 오류를 피하기 위해 pass를 사용합니다. 당신이 퀴즈를 연주하고 기억

 if(dont_know_the_answer)
      pass

예제 프로그램

  for letter in 'geeksforgeeks':
        pass
  print 'Last Letter :', letter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.