문제

존재합니다 파이썬을위한 정적 분석 도구, 그러나 컴파일 시간 점검은 런타임 바인딩 철학 그 파이썬은 포용됩니다. 이것의 가능한 표준 Python 통역사를 정적 분석 도구로 래핑하여 일부를 시행합니다. "Strict를 사용하십시오"-제약과 같은 제약이지만, 우리는 그러한 것을 널리 채택하지는 않습니다.

Python에 대해 "엄격한 사용"행동을 불필요하거나 특히 바람직하지 않게 만드는 것이 있습니까?

또는 광범위한 채택에도 불구하고 "엄격한 사용"행동이 Perl에서 불필요합니까?

참고 : "필요한"이라는 의미는 엄밀히 필요하지 않은 "실질적으로 필요한"것을 의미합니다. 분명히 당신 ~할 수 있다 "Strict 사용"없이 Perl을 작성하지만 (내가 본 것) 대부분의 Perl 프로그래머 하다 그걸 써.

참고 : Python 통역사 래퍼는 필요하지 않습니다 필요하다 "Strict"-유사한 제약 조건-일반 통역사가 무시할 "Strict 사용"과 유사한 의사 프라그마를 사용할 수 있습니다. 나는 언어 수준의 기능을 추가하는 것에 대해 말하는 것이 아닙니다.


업데이트 : 주석 당 Perl에서 "Strict 사용"이 무엇을하는지 설명합니다. (공식 문서에 대한 링크는 첫 번째 단락에 있습니다.)

"Strict"Directive에는 세 가지 구성 요소가 있으며 그 중 두 개만이 정말 흥미 롭습니다.

  • Strict Vars 사용 : 프로그램에서 어휘 스코프 가변 사용법을 정적으로 확인하십시오. (파이썬에는 기본적으로 global 범위와 local 범위). 많은 파이썬 라이터들이 이런 종류의 것을 점검합니다. Linters는 그들이 할 수있는 유일한 정적 분석이기 때문에, 당신이 간단한 어휘 스코핑을 사용한다고 가정하고 당신이 그들에게 닥치라고 말할 때까지 그런 의미에서 잘못 보이는 것들에 대해 경고합니다. 즉

    FOO = 12
    foo += 3
    

    네임 스페이스로 멋진 일을하지 않으면 오타를 확인하는 데 유용 할 수 있습니다.

  • Strict Refs 사용 : 기호 네임 스페이스 탈 등급을 방지합니다. Python의 가장 가까운 아날로그가 사용 중입니다 locals() 그리고 globals() 상징적 바인딩 및 식별자 조회를 수행합니다.

  • 엄격한 서브 사용 : 파이썬에는 실제 아날로그가 없습니다.

도움이 되었습니까?

해결책

"Python이 포용하는 런타임 바인딩 철학은 ..."엄격한 사용 "행동을 불필요하게 사용합니다.

꽤 좋은 요약. 감사.

그것은 본질적으로 그것입니다. 정적 분석 도구는 파이썬을 충분히 가치있게하는 데 도움이되지 않습니다.


편집하다

"나는 우리에게 내성을 요구할 것을 요구한다 우리는 그것을 필요로하지 않으며, 관련하여 Perl 프로그래머가 필요하다고 생각하는 이유. "

그 이유는 왜 당신이 이미 준 이유입니다. 도움이되지 않기 때문에 필요하지 않습니다. 분명히, 당신은 그 대답을 좋아하지 않지만 더 이상 할 말이 없습니다. 컴파일 타임 또는 사전 컴파일 시간 점검은 단순히 도움이되지 않습니다.

그러나 시간을내어 질문을 다시 한 번 요청 했으므로 이미 준 답변에 대한 더 많은 증거를 제공하겠습니다.

나는 파이썬을 쓰는만큼 거의 Java를 씁니다. Java의 정적 유형 검사는 논리 문제를 방지하지 않습니다. 회의 성과 요구 사항을 촉진하지 않습니다. 사용 사례를 충족시키는 데 도움이되지 않습니다. 단위 테스트의 양을 줄이지 않습니다.

정적 유형 검사는 때때로 메소드의 오용을 발견하지만 파이썬에서도 빨리 알게됩니다. 파이썬에서는 실행되지 않기 때문에 단위 테스트 시간에 찾을 수 있습니다. 참고 : 나는 영리한 단위 테스트가 많은 잘못된 유형이 발견된다고 말하는 것이 아닙니다. 나는 대부분의 잘못된 유형 문제가 단순히 어설 션을 테스트하기에 충분히 실행되지 않는 모집되지 않은 예외를 통해 발견된다고 말하고 있습니다.

Pythonistas가 정적 점검에 시간을 낭비하지 않는 이유는 간단합니다. 우리는 그것을 필요로하지 않습니다. 어떤 가치도 제공하지 않습니다. 경제적 이점이없는 수준의 분석입니다. 실제 사람들이 실제 데이터를 가지고있는 실제 문제를 더 이상 해결할 수는 없습니다.

언어 (문제 도메인이나 라이브러리가 아님)와 관련된 가장 인기있는 파이썬 질문을 살펴보십시오.

"foo is none"과 "foo == none"사이에 차이가 있습니까? -- == vs. is. 정적 점검이 도움이 될 수 없습니다. 또한 참조하십시오 Python에`==`과`IS '가 차이가 있습니까?

** (Double Star)와 * (Star)는 매개 변수에 대해 무엇을합니까? -- *x 목록을 제공하고 **x 사전을 제공합니다. 당신이 이것을 모른다면, 당신의 프로그램은 그러한 유형에 부적절한 일을하려고 할 때 즉시 사망합니다. "프로그램이 '부적절한'것을하지 않는다면 어떻게해야합니까?" 그런 다음 귀하의 프로그램이 작동합니다. '그런가 말했다.

파이썬에서 '열거'를 어떻게 표현할 수 있습니까? -이것은 일종의 제한 도메인 유형에 대한 탄원입니다. 클래스 수준 값을 가진 클래스는 그 일을 거의합니다. "누군가가 과제를 바꾸면 어떻게해야합니까?" 건축하기 쉽습니다. 우세하다 __set__ 예외를 제기합니다. 예 정적 점검이 이것을 발견 할 수 있습니다. 아니요, 실제로 누군가가 열 상수와 변수에 대해 혼란스러워하는 것은 일어나지 않습니다. 그리고 그들이 할 때, 런타임에 쉽게 발견 할 수 있습니다. "논리가 결코 실행되지 않으면 어떻게해야합니까?" 글쎄, 그것은 디자인이 좋지 않고 단위 테스트가 좋지 않습니다. 컴파일러 오류를 던지고 테스트되지 않은 잘못된 논리를 넣는 것은 테스트되지 않았을 때 동적 언어로 발생하는 것보다 낫지 않습니다.

발전기 표현식 대 목록 이해력 - 정적 점검은이 질문을 해결하는 데 도움이되지 않습니다.

왜 1 +++ 2 = 3입니까? - 정적 점검은 이것을 발견하지 못할 것입니다. C의 1 +++ 2는 모든 컴파일러 점검에도 불구하고 완벽하게 합법적입니다. 그것은 C에서와 마찬가지로 Python에서는 같은 것이 아니라 합법적입니다. 그리고 혼란 스럽습니다.

목록의 목록은 예기치 않게 하위 목록에 반영된 변경 사항입니다 - 이것은 전적으로 개념적입니다. 정적 점검은이 문제를 해결하는 데 도움이 될 수 없습니다. Java 등가는 또한 컴파일하고 나쁘게 행동합니다.

다른 팁

글쎄, 나는 파이썬 프로그래머가 많지 않지만 대답은 '예'라고 말하고 싶습니다.

언제든지 이름으로 변수를 만들 수있는 동적 언어는 '엄격한'프라그마를 사용할 수 있습니다.

Perl의 Strict vars (Perl에서 엄격한 옵션 중 하나, 'Strict'옵션 'Strict'는 한 번에 모두 켜집니다)는 모든 변수를 사용하기 전에 선언해야합니다. 이는이 코드를 의미합니다.

my $strict_is_good = 'foo';
$strict_iS_good .= 'COMPILE TIME FATAL ERROR';

컴파일 시간에 치명적인 오류가 발생합니다.

컴파일 시간에 Python 이이 코드를 거부하는 방법을 모릅니다.

strict_is_good = 'foo';
strict_iS_good += 'RUN TIME FATAL ERROR';

당신은 런타임 예외를 얻을 것입니다 strict_iS_good 정의되지 않았습니다. 그러나 코드가 실행될 때만. 테스트 스위트에 100% 적용 범위가 없으면이 버그를 쉽게 배송 할 수 있습니다.

이 행동이없는 언어로 일할 때마다 (예 : PHP) 긴장합니다. 나는 완벽한 타이피스트가 아닙니다. 간단하지만 발견하기 어려운 오타는 추적하기 어려운 방식으로 코드가 실패 할 수 있습니다.

따라서 반복하기 위해 Python은 'Strict'Pragma를 사용하여 컴파일 시간에 확인할 수있는 것들에 대한 컴파일 타임 체크를 켤 수 있습니다. 추가 할 다른 수표는 생각할 수 없지만 더 나은 파이썬 프로그래머는 아마도 일부를 생각할 수 있습니다.

메모 나는 Perl에서 Stict vars의 실용적인 효과에 중점을두고 일부 세부 사항을 광택시킵니다. 모든 세부 사항을 정말로 알고 싶다면 엄격한 perldoc.

업데이트 : 일부 의견에 대한 응답

제이슨 베이커 : Pylint와 같은 정적 체커가 유용합니다. 그러나 그들은 종종 건너 뛸 수있는 추가 단계를 나타냅니다. 컴파일러에 몇 가지 기본 검사를 구축하면 이러한 점검이 일관되게 수행되도록 보장합니다. 이러한 수표가 Pragma에 의해 제어 될 수 있다면, 수표 비용과 관련된 이의 제기조차도 무의미해진다.

popcnt : 파이썬이 런타임 예외를 생성한다는 것을 알고 있습니다. 나는 많이 말했다. 가능한 경우 컴파일 시간 점검을 옹호합니다. 게시물을 다시 읽으십시오.

mpeters : 코드의 컴퓨터 분석은 모든 오류를 찾을 수 없습니다. 이는 중단 문제를 해결하는 데 금액이 있습니다. 더 나쁜 것은 과제에서 오타를 찾으려면 컴파일러가 귀하의 의도 의도가 코드와 다른 곳을 찾으십시오. 이것은 분명히 불가능합니다.

그러나 이것이 점검을 수행해서는 안된다는 의미는 아닙니다. 감지하기 쉬운 클래스의 문제가 있다면이를 가로워하는 것이 합리적입니다.

나는 Pylint와 Pychecker에 대해 충분히 익숙하지 않아 어떤 클래스의 오류가 잡을 것인지 말할 수 있습니다. 내가 말했듯이 나는 파이썬에 매우 경험이 없다.

이러한 정적 분석 프로그램은 유용합니다. 그러나 컴파일러의 기능을 복제하지 않으면 컴파일러는 항상 정적 체커가 할 수있는 것보다 프로그램에 대해 더 많은 것을 알 수있는 위치에 있다고 생각합니다. 가능한 경우 오류를 줄이기 위해 이것을 활용하지 않는 것이 낭비적인 것 같습니다.

Update 2:

Codleary- 이론적으로, 나는 당신과 동의합니다. 정적 분석기는 컴파일러가 할 수있는 모든 검증을 수행 할 수 있습니다. 그리고 파이썬의 경우 충분해야합니다.

그러나 컴파일러가 충분히 복잡한 경우 (특히 컴파일이 발생하는 방식을 변경하거나 PERL과 같은 경우 컴파일 시간에 코드를 실행할 수있는 프라그마가 많으면 정적 분석기가 컴파일러/통역사의 복잡성에 접근해야합니다. 분석을 수행하십시오.

Heh, 복잡한 컴파일러 및 컴파일 시간에 실행 코드에 대한이 모든 이야기는 내 Perl 배경을 보여줍니다.

내 이해는 파이썬에 pragmas가 없으며 컴파일 시간에 임의 코드를 실행할 수 없다는 것입니다. 따라서 내가 틀렸거나 이러한 기능이 추가되지 않는 한, 정적 분석기의 비교적 간단한 파서로 충분해야합니다. 모든 실행마다 이러한 점검을 강요하는 것이 확실히 도움이 될 것입니다. 물론, 내가 할 수있는 방법은 Pragma와 함께하는 것입니다.

믹스에 pragmas를 추가하면 미끄러운 경사면을 시작했으며 분석기의 복잡성은 Pragmas에서 제공하는 전력과 유연성에 비례하여 성장해야합니다. 조심하지 않으면 Perl처럼 감을 수 있으며 "Python 만 Python을 구문 분석 할 수 있습니다."

어쩌면 명령 줄 스위치가 강제 정적 분석을 추가하는 더 좋은 방법 일 것입니다.)

(Perl Can과 같은 컴파일 시간 동작으로 FUTZ를 할 수 없다고 말할 때 Python의 기능을 방해하지 않을 것입니다. 나는 이것이 신중하게 고려 된 디자인 결정이라는 구제를 가지고 있으며, 그것의 지혜를 볼 수 있습니다. Perl 's 컴파일 타임의 극도의 유연성은 IMHO, 언어의 큰 힘과 끔찍한 약점입니다. 나는이 접근법에서도 지혜를 본다.)

Python에는 스크립트 구문을 변경할 수있는 것이 있습니다.

from __future__ import print_function

구문의 영향을 미치는 다양한 미래의 기능. Python의 구문은 역사적 Perl보다 더 엄격하고 스타블러이며 잘 정의 된 것입니다. '엄격한 심판'과 '엄격한 서브'가 금지되는 것들이 파이썬에는 결코 존재하지 않았습니다.

'Strict vars'는 주로 타이로 된 참조를 중지하고 실수로 누락 된 내용입니다. 지역 선언에 대한 기본값이 기본적으로 기본적으로 표시되므로 파이썬에서는 발생할 수 없으며, 할당되지 않은 기호로 인해 예외가 생깁니다.

(사용자가 우연히 '글로벌'진술로 선언하지 않고 우연히 글로벌에 쓰기를 시도하는 경우가 여전히 있습니다. 현지인을 선언 해야하는 논쟁의 여지가있는 경우입니다. 경험이 풍부한 Python 프로그래머는 거의 없었지만 가독성 부담을 받아 들일 것입니다.)

구문이 포함되지 않은 다른 언어 및 라이브러리 변경은 경고 체계.

나는 내가보고있는 의견에서 "Strict"가하는 일과 같은 혼란이 있다고 생각합니다. 컴파일 타임 유형 검사 (자바처럼)를 켜지 않습니다. 그런 의미에서 Perl Progammers는 Python 프로그래머와 일치합니다. S.Lott는 이러한 유형의 수표가 논리 버그로부터 보호하지 않으며, 작성해야 할 단위 테스트의 수를 줄이지 않으며 우리는 또한 속박 프로그래밍 팬이 아닙니다.

다음은 "Strict 사용"이하는 일의 목록입니다.

  1. 기호 참조를 사용하는 것은 런타임 오류입니다. 이것은 당신이 미친 짓을하지 못하게합니다 (그러나 때로는 유용한 것들)

    $var = 'foo';

    $foo = 'bar';

    print $$var; # this would contain the contents of $foo unless run under strict

  2. 노출되지 않은 변수를 사용하는 것은 런타임 오류입니다 (이는 변수를 사용하기 전에 변수의 범위를 선언하기 위해 "my", "our"또는 "local"을 사용해야한다는 것을 의미합니다.

  3. 모든 바레 노드는 컴파일 타임 구문 오류로 간주됩니다. Bareword는 기호 나 서브 루틴으로 선언되지 않은 단어입니다. 이것은 주로 역사적으로 행해졌지만 실수로 간주되는 것을 금지하는 것입니다.

파이썬은 진정한 어휘 스코핑이 없으므로 엄격한 VAR은 그리 합리적이지 않습니다. 그것은 상징적 인 참고 문헌이 없으므로 엄격한 심판이 필요하지 않습니다. 바레 노드가 없으므로 엄격한 VARS가 필요하지 않습니다.

솔직히 말해서, 그것은 내가 놓친 어휘 스코핑 일뿐입니다. 다른 두 사람은 Perl에서 사마귀를 고려합니다.

이 원래의 대답은 정확하지만 상황을 실용적으로 설명하지는 않습니다.

파이썬에 대한 정적 분석 도구가 존재하지만 컴파일 시간 검사는 파이썬이 수용하는 런타임 바인딩 철학에 반대하는 경향이 있습니다.

PERL에서 'Strict'가 제공하는 것은 컴파일 타임에 잘못된 또는 가변 이름이 (일반적으로) 잡히는 것을 보장하는 능력입니다. 이것은 코드 안정성을 향상시키고 개발 속도를 높입니다. 그러나 그러한 일을 가치있게 만들려면 변수를 선언해야합니다. 그리고 파이썬 스타일은 그것을 낙담시키는 것 같습니다.

따라서 파이썬에서는 런타임에 당신이 만든 과제가 만들어지지 않았거나 표현이 예상치 못한 가치로 해결되는 것처럼 보일 때까지 잘못된 변수에 대해 알지 못합니다. 이러한 오류를 잡는 것은 특히 프로그램이 커지고 사람들이 다른 사람들이 개발 한 코드를 유지해야함에 따라 시간이 많이 걸릴 수 있습니다.

Java와 C/C ++는 유형 확인을 통해 한 걸음 더 나아갑니다. 동기는 철학적이 아니라 실용적입니다. 가능한 빨리 가능한 한 빨리 많은 오류를 포착하고 프로덕션에 코드를 공개하기 전에 모든 오류를 제거 할 수 있습니까? 각 언어는 특정한 전략을 취하고 그들이 생각하는 것에 따라 그와 함께 실행되는 것 같습니다. 런타임 바인딩이 지원되지 않는 Perl과 같은 언어에서는 개발을보다 쉽게하기 위해 'Strict 사용'을 활용하는 것이 합리적입니다.

나는 고려한다 'use strict' 당신이 암시 한 것처럼 Pragma와 같은 Perl에서 : 컴파일러의 동작이 바뀝니다.

Perl 언어 철학은 파이썬 철학과 다릅니다. 에서와 같이, 당신은 Perl에서 자신을 반복적으로 매달릴 수있는 충분한 밧줄 이상이 주어집니다.

Larry Wall은 언어학에 크기 때문에 Perl에서 Timtowtdi라고하는 것을 가지고 있습니다 ( tim-toe-dee) 원리 대 파이썬의 선 :

그것을하는 방법은 하나, 그리고 바람직하게는 하나만 존재해야합니다.

Pylint와 Pychecker를 쉽게 사용하여 자신의 풍미를 만들 수 있습니다. use strict 파이썬 (또는 유사한 것)의 경우 perl -cw *scriptname*) 그러나 언어 디자인의 다른 철학 때문에, 당신은 실제로 이것을 광범위하게 만날 수 없습니다.

첫 번째 포스터에 대한 귀하의 의견을 바탕으로 Python 's에 익숙합니다. import this. 왜 당신이 동등한지를 보지 못하는 이유를 밝히는 많은 것들이 있습니다. use strict 파이썬에서. 당신이 명상한다면 코안 파이썬의 선에서 발견되면, 당신은 자신을 위해 깨달음을 찾을 수 있습니다. :)

나는 선언되지 않은 VAR에 대한 참조를 감지하는 것에 대해서만 관심이 있음을 알았습니다. Eclipse는 Pydev를 통해 Pylint 통합을 가지고 있으며 Pylint는 완벽하지는 않지만 합리적인 작업을 수행합니다.

그것은 Python의 역동적 인 특성에 맞서고, 내 코드가 무언가에 대해 영리 해지면 때때로 #ignores를 추가해야합니다. 그러나 나는 그것이 내가 그것에 만족하기에 충분히 충분히 일어나고 있음을 알았습니다.

그러나 일부 파일 린트와 같은 기능의 유용성이 명령 줄 플래그 형태로 제공되는 것을 볼 수있었습니다. Python 2.6의 -3 스위치와 같은 종류는 Python 2.x와 3.x 코드 사이의 비 호환성 지점을 식별합니다.

Perl에서 'Strict'를 사용하지 않고 큰 프로그램을 작성하는 것은 매우 어렵습니다. 'Strict'를 사용하지 않으면 변수를 다시 사용하고 편지를 남겨 두어 철자를 철회하면 프로그램이 여전히 실행됩니다. 결과를 확인하는 테스트 사례가 없으면 그러한 오류를 찾을 수 없습니다. 이러한 이유로 인해 왜 잘못된 결과를 얻었는지 알아내는 데는 시간이 많이 걸릴 수 있습니다.

내 PERL 프로그램 중 일부는 5,000 줄에서 10,000 줄의 코드로 구성되어 수십 개의 모듈로 나뉩니다. 'Strict 사용'없이는 실제로 프로덕션 프로그래밍을 할 수 없습니다. "변수 선언"을 시행하지 않는 언어가있는 공장에 프로덕션 코드를 설치하지는 않습니다.

이것이 Perl 5.12.x가 이제 기본 동작으로 '엄격한 사용'을 갖는 이유입니다. 당신은 그것들을 끄질 수 있습니다.

PHP는 가변 선언 시행이 없기 때문에 몇 가지 문제를 제기했습니다. 따라서이 언어로 소규모 프로그램으로 제한해야합니다.

그냥 의견 ...

abcparsing

Perl은 그들이 말한 것처럼 제한되지 않은 언어입니다 :). 따라서 발표 전에 변수를 사용할 수 있습니다. 예 : "is_array"var name을 사용하지만 "is_arrby"를 입력하면 컴파일러는 "Strict 사용"없이 오류를보고하지 않습니다. 따라서 Perl에서 긴 프로그램을 코딩 할 때 "Strict 사용"명령문을 더 잘 사용하십시오. 물론 한 번의 스크립트를 실행하기위한 50 줄 미만의 줄은 필요하지 않습니다 :)

"Pythonic"코드의 이상적인 것 같습니다. use strict.

나는 Perl 배경이 없지만, 내가 아는 바에 따르면, 코드가 "보다 신뢰할 수있게되기 위해서는 비활성화 해야하는 기능이 없기 때문에 그런 의미에서는 불필요하다고 말할 수 있다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top