[python] 암호문을 사용하는 방법?

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

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



답변

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

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

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

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

그러면 다음을 얻습니다.

IndentationError: expected an indented block

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


답변

파이썬은 코드 블록 (후 그 구문 요구 사항이 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. 특히 두 가지 경우에 유용합니다. “이 추상 메소드는 모든 서브 클래스에 의해 구현되어야합니다.이 기본 클래스에서이를 정의하는 일반적인 방법은 없습니다” 또는 ” 이 이름은 아직이 릴리스에서 구현되지 않았지만 서명 방식은 다음과 같습니다.” )


답변

구현되지 않은 함수의 자리 표시 자로 사용하는 것 외에도 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


답변

생각하는 가장 정확하고 가장 정확한 방법 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

중단 점을 통과시킵니다.


답변

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

class Error(Exception):
    pass

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


답변

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 이러한 시나리오에서 사용할 수 있습니다.


답변

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 "

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