if __name__ == '__main__' 아래에서 코드를 꾸물꾸물 쓰는 사람은 손을 드세요

8220 단어 Python
새해 복 많이 받으세요.
새해 벽두에 나는 선생님과 모두에게 하고 싶은 말이 있다.
코드, ifname__ == '__main__'아래에서 코드를 질질 끌며 쓰는 사람은 손을 드세요.
이런 느낌name__ == '__main__'코드를 쓴 사람.
#! usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, print_function, absolute_import
import sys


def say_args(kind, data_list):
    print("kind:", kind, " data:", data_list)


if __name__ == '__main__':
    args = sys.argv[1:]
    assert args

    kind = args[0].lower()
    data_list = [x.lower() for x in args[1:]]

    say_args(kind, data_list)
이런 코드를 쓴 사람, 선생님, 화내지 말고 손을 드세요.
당신은 이런 코드가 전 세계 범위의 명명 공간을 오염시켰다는 것을 알아차렸습니까?
주의하고 이해한 후에 쓴 사람은 손을 놓을 수 있다.

if __name__ == '__main__'다음은 전 세계.


예,ifname__ == '__main__'다음은 전 세계적인 범위다.
따라서 정의된 변수는 모두 전역 변수입니다.
방금 코드에서 로컬 변수args,kind,data_list는 전역 변수입니다.
따라서 아래 코드를 써도 오류가 발생하지 않는다.
def say_args(kind, data_list):
    print("kind:", kind, " data:", data_list)
    # 未定義のargsを参照してもエラーにならない、グローバル変数argsが参照される
    print("args: ", args)
※ 위의 글은 수정되었으니 자세한 내용은 "2017-01-02 변수""x""수정" 참조.
이것을 직접 실행하면 오류가 발생하지 않으며 모듈로 부르면 Name Error 가 되어 번거로운 오류의 근원입니다.
그러니python 선생님의 언어 규범을 모방하지 마세요.
이 일에 관해 PyCharm 선생님도 "Shadows name"kind'form outer scope"라고 화를 내셨다.

해결책


if __name__ == '__main__'아래에 코드를 쓰고 싶으면 함수로 싸라.
#! usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, print_function, absolute_import
import sys


def main(args):
    assert args

    kind = args[0].lower()
    data_list = [x.lower() for x in args[1:]]

    say_args(kind, data_list)


def say_args(kind, data_list):
    print("kind:", kind, " data:", data_list)


if __name__ == '__main__':
    main(sys.argv[1:])
main 함수를 포함하여 전역 작용 영역의 명칭 공간을 오염시키지 않습니다.또한main 함수를 포함하여main 처리를 시작할 수 있어 코드의 전망이 좋아질 수 있다.
초보자 여러분은 함수로 포장하는 것이 가장 좋습니다.
다른 걱정되는 분들은 PyCharm 선생님을 사용해 주세요. 이미 고모처럼... 아니요, 손발이 풀려서 안 되는 부분을 지적해 드릴게요.
pyflash 선생님, pyflaks 선생님과 pylint 선생님도 괜찮아요. pylint 선생님이 더 엄격해요.
(1/1 수정:pyflack 선생님이 안 계셔서pyflaks 선생님이 틀렸어요)
선생님이 하고 싶은 말이 이거예요.
"main 함수로 싸면 모듈로 사용하고 싶을 때 쓸모없는main 함수로 만들 수 있다"는 사람도 있다. 이후 사무실에서 선생님과 개별 대화를 나눈다.

보충 수업을 썼다


ifname__ == '__main__' 아래에서 코드를 꾸물꾸물 쓰는 사람은 손을 드세요

2017-01-02 변수 "x" 수정


knoguchi 선생의 평어를 받아들여 정정하다.
글에서 고치면 글이 읽기 어려워져 문말로 이동했다.
[수정 전 기사]
아까 코드에서는 로컬 변수args, kind, data_list, 임시 변수x도 전역 변수로 바뀌었다.
def say_args(kind, data_list):
    print("kind:", kind, " data:", data_list)
    # 未定義のxを参照してもエラーにならない、グローバル変数xが参照される
    print("x: ", x)
포함 표현에 사용된 x에 대해서는 글로벌 변수가 될 수 없으며 오류가 발생했습니다.
그러나 PyCharm의 실행에 오류가 없을 것 같습니다. 이것은 PyCharm이 고속화를 위해 전역 프레임을 다시 이용했기 때문입니다.
결과의 확인은 PyCharm에서만 수행할 수 없다는 것이 교훈이다.
다시 한 번 knoguchi씨에게 감사를 드립니다.
댓글에서'리스크 전환의 변수 유출은 재속박의 문제'가 패키지 표시의 중점 중 하나입니다. 댓글을 동시에 읽어주세요.

좋은 웹페이지 즐겨찾기