더 큰 프로젝트에서 정적 타이핑은 실제로 어떻게 도움이됩니까?


9

스크립팅 프로그래밍 언어 사이트의 메인 페이지에서 호기심을 느끼면서 다음과 같은 구절이 발생했습니다.

시스템이 너무 커서 머리에 들어 가지 않으면 정적 유형을 추가 할 수 있습니다.

이것은 많은 종교에서 정적, 컴파일 된 언어 (Java와 같은)와 동적이고 해석 된 언어 (주로 파이썬은 더 많이 사용되지만 대부분의 스크립팅 언어간에 공유되는 "문제") 사이의 전쟁에서 정적이라는 불평을 기억합니다. 동적으로 입력 된 언어에 대한 유형이 지정된 언어의 팬은 "하루에 함수의 반환 유형을 잊어 버리고 정적 유형의 언어를 사용하는 동안 모든 유형을 찾아야하기 때문에 더 큰 프로젝트로 확장 할 수 없다는 것입니다. 명시 적으로 선언되었습니다. "

나는 이런 말을 이해하지 못했습니다. 솔직히 말해서 함수의 반환 유형을 선언하더라도 많은 코드 줄을 작성한 후에는 함수를 잊을 수 있으며 잊어 버릴 수 있습니다. 텍스트 편집기로 확인하십시오.

또한 함수가로 선언 type funcname()...되면 whitout type은 함수가 호출되는 각 줄을 검색해야 한다는 것을 알고 있습니다. 왜냐하면 funcname파이썬과 같은 코드에서 검색 def funcname하거나 function funcname한 번만 발생하기 때문에 선언.

또한 REPL을 사용하면 다른 입력으로 리턴 유형에 대한 함수를 테스트하는 것이 쉽지 않습니다. 정적으로 유형이 지정된 언어의 경우 코드를 추가하고 선언 된 유형을 알기 위해 모든 것을 다시 컴파일해야합니다.

따라서 정적으로 유형이 지정된 언어의 장점이 아닌 함수의 반환 유형을 아는 것 외에는 큰 유형의 프로젝트에서 정적 유형이 실제로 어떻게 도움이됩니까?



2
다른 질문에 대한 답을 읽으면 아마도이 질문에 필요한 답을 얻을 수있을 것입니다. 그들은 기본적으로 다른 관점에서 같은 것을 요구합니다. :)
sara

1
스위프트와 놀이터는 정적으로 입력 된 언어의 REPL입니다.
daven11

2
언어는 컴파일되지 않고 구현됩니다. "컴파일 된"언어에 대한 REPL을 작성하는 방법은 언어를 해석하거나 최소한 한 줄씩 언어를 컴파일하고 실행하여 필요한 상태를 유지하는 것을 작성하는 것입니다. 또한 Java 9는 REPL과 함께 제공됩니다.
Sebastian Redl

2
@ user6245072 : 통역사를위한 REPL을 만드는 방법은 다음과 같습니다. 코드를 읽고, 통역사에게 보내고, 결과를 인쇄하십시오. 컴파일러에 대한 REPL을 만드는 방법은 다음과 같습니다. 코드를 읽고, 컴파일러에게 보내고 , 컴파일 된 코드를 실행하고 , 결과를 출력합니다. 파이처럼 쉽습니다. 이것이 바로 FSi (F♯ REPL), GHCi (GHC Haskell 's REPL), Scala REPL 및 Cling이하는 일입니다.
Jörg W Mittag

답변:


21

또한 REPL을 사용하면 입력이 다른 리턴 타입에 대한 함수를 테스트하는 것이 쉽지 않습니다.

사소한 것이 아닙니다. 그것은 사소한 아니다 전혀 . 사소한 기능을 위해이 작업을 수행하는 것은 사소한 일입니다.

예를 들어 반환 유형이 전적으로 입력 유형에 의존하는 함수를 간단하게 정의 할 수 있습니다.

getAnswer(v) {
 return v.answer
}

이 경우, getAnswer정말하지 않습니다 하나의 반환 유형을. 리턴 유형이 무엇인지 배우기 위해 샘플 입력으로 이것을 호출하는 테스트는 작성할 수 없습니다. 그것은 것입니다 항상 실제 인수에 따라 달라집니다. 런타임에.

그리고 여기에는 데이터베이스 조회를 수행하는 기능도 포함되지 않습니다. 또는 사용자 입력을 기반으로 작업을 수행하십시오. 또는 동적 유형 인 전역 변수를 찾으십시오. 또는 임의의 경우 반환 유형을 변경하십시오. 매번 모든 개별 기능을 수동으로 테스트해야 할 필요성은 말할 것도 없습니다.

getAnswer(x, y) {
   if (x + y.answer == 13)
       return 1;
   return "1";
}

기본적으로 일반적인 경우 함수의 반환 유형을 증명하는 것은 문자 적으로 수학적으로 불가능합니다 (Halting Problem). 하는 방법 보장 반환 형식이 질문에 대답하는 증명할 수없는 프로그램을 허용하지 의해 중단 문제의 도메인에 해당되지 않도록 입력을 제한하는 것입니다, 이것은 정적 타이핑가하는 일입니다.

또한 함수가 funcname () ... 유형으로 선언되면 whitout knowing type은 함수가 호출되는 각 줄을 검색해야합니다. 파이썬과 같은 경우에는 funcname 만 알고 있기 때문입니다. 선언에서 def funcname 또는 funcname 함수를 한 번만 검색하십시오.

정적으로 입력 된 언어에는 "도구"라는 것이 있습니다. 소스 코드로 작업하는 데 도움이되는 프로그램입니다. 이 경우 Resharper 덕분에 마우스 오른쪽 버튼을 클릭하고 정의로 이동합니다. 또는 키보드 단축키를 사용하십시오. 또는 마우스를 올려 놓으면 관련된 유형이 무엇인지 알려줍니다. 파일 grepping에 대해서는 조금 신경 쓰지 않습니다. 텍스트 편집기 자체는 프로그램 소스 코드를 편집하기위한 한심한 도구입니다.

def funcname함수에서 임의로 재 할당 할 수 있기 때문에 메모리 에서 파이썬으로는 충분하지 않습니다. 또는 여러 모듈에서 반복적으로 선언 될 수 있습니다. 또는 수업 중. 기타.

텍스트 편집기의 검색 기능을 사용하여 선언 된 줄로 돌아가서 확인해야합니다.

함수 이름에 대한 파일 검색은 절대로 필요하지 않은 끔찍한 기본 작업입니다. 이는 환경 및 툴링의 근본적인 실패를 나타냅니다. 파이썬에서 텍스트 검색이 필요하다는 사실은 파이썬과의 대단한 포인트입니다.


2
공정하게 말하면, 이러한 "도구"는 동적 언어로 개발되었으며 동적 언어는 정적 언어보다 오래 전에 사용되었습니다. 정적 언어도 그래픽 IDE는 물론 그래픽 또는 IDE를 갖기 전에 그래픽 리스프 및 스몰 토크 IDE에 존재하는 정의, 코드 완성, 자동 리팩토링 등으로 이동하십시오.
Jörg W Mittag

함수의 반환 유형을 알고 항상 기능이 무엇을 말하지 않습니다 마십시오 . 유형을 작성하는 대신 샘플 값으로 문서 테스트를 작성할 수 있습니다. 예를 들어 (단어 '일부 단어 oue') => [ 'some', 'words', 'oeu']와 (단어 문자열)-> [string], (zip {abc} [1..3]) => [(a, 1), (b, 2), (c, 3)] 형식을 사용하십시오.
aoeu256

18

수년간에 걸쳐 변화 한 많은 프로그래머가있는 프로젝트를 생각해보십시오. 이것을 유지해야합니다. 기능이 있습니다

getAnswer(v) {
 return v.answer
}

지구상에서 무엇을합니까? 무엇입니까 v? 요소는 answer어디에서 왔습니까?

getAnswer(v : AnswerBot) {
  return v.answer
}

이제 더 많은 정보가 있습니다. 의 유형이 필요합니다 AnswerBot.

우리가 수업 기반 언어로 가면

class AnswerBot {
  var answer : String
  func getAnswer() -> String {
    return answer
  }
}

이제 우리는 유형의 변수를 가질 수 AnswerBot있고 메소드를 호출 할 수 getAnswer있으며 모든 사람들이 그 기능을 알고 있습니다. 런타임 테스트를 수행하기 전에 컴파일러가 변경 사항을 포착합니다. 다른 많은 예가 있지만 아마도 이것이 당신에게 아이디어를 줄 것입니까?


1
그와 같은 함수가 존재 할 이유가 없음을 지적하지 않는 한 이미 명확 해 보입니다 .bu는 물론 예일뿐입니다.
user6245072

큰 프로젝트에 여러 프로그래머가있을 때의 문제는 그와 같은 기능이 존재한다는 것입니다. 또한 동적 언어의 함수가 전역 네임 스페이스에 있다고 생각하므로 시간이 지남에 따라 getAnswer 함수가 몇 개있을 수 있으며 작동 시간이 다르고 서로 다른 시간에로드되기 때문에 둘 다 다릅니다.
daven11

1
나는 그것이 그것을 일으키는 기능적 프로그래밍에 대한 오해라고 생각합니다. 그러나 전역 네임 스페이스에 있다고 말하는 것은 무엇을 의미합니까?
user6245072

3
"동적 언어의 함수는 기본적으로 전역 네임 스페이스에 있습니다"이것은 언어 별 세부 사항이며 동적 입력에 의한 제약이 아닙니다.
sara

2
@ daven11 "실제로 자바 스크립트를 생각하고 있습니다"라고 생각하지만 다른 동적 언어에는 실제 네임 스페이스 / 모듈 / 패키지가 있으며 재정의에 대해 경고 할 수 있습니다. 당신은 약간 지나치게 생성하고있을 수 있습니다.
코어 덤프

10

판단이 흐려질 수있는 대규모 정적 프로젝트 작업에 대한 몇 가지 오해가있는 것 같습니다. 다음은 몇 가지 사항입니다.

함수의 리턴 유형을 선언하더라도 많은 코드 행을 작성한 후에는이를 잊어 버릴 수 있으며 텍스트 편집기의 검색 기능을 사용하여 선언 된 행으로 돌아 가야합니다. 확인해 봐.

정적으로 유형이 지정된 언어를 사용하는 대부분의 사람들은 언어 별 IDE 또는 언어 별 도구와 통합 된 지능형 편집기 (vim 또는 emacs)를 사용합니다. 일반적으로 이러한 도구에서 함수 유형을 찾는 빠른 방법이 있습니다. 예를 들어 Java 프로젝트에서 Eclipse를 사용하면 일반적으로 메소드 유형을 찾는 두 가지 방법이 있습니다.

  • 'this'이외의 다른 객체에서 메소드를 사용하려면 참조와 점을 입력하십시오 (예 someVariable.:). Eclipse는 유형을 찾고 해당 유형에 someVariable정의 된 모든 메소드의 드롭 다운 목록을 제공합니다. 목록을 아래로 스크롤하면 각 유형과 문서가 선택되는 동안 표시됩니다. 편집기가 유형을 판별하기가 어렵 기 때문에 (또는 경우에 따라 불가능하기 때문에) 동적 언어로는 달성하기가 매우 어렵 기 때문에 someVariable올바른 목록을 쉽게 생성 할 수 없습니다. 메소드를 사용하려면 thisctrl + space를 눌러 동일한 목록을 얻을 수 있습니다 (이 경우 동적 언어에서는 달성하기 어렵지 않습니다).
  • 특정 방법에 대한 참조가 이미있는 경우 마우스 커서를 해당 방법으로 이동하면 해당 방법의 유형과 설명서가 툴팁에 표시됩니다.

보시다시피, 이것은 동적 언어에 사용 가능한 일반적인 툴링보다 다소 낫습니다 ( 동적 언어에서는 불가능 하지 않습니다. 일부는 매우 우수한 IDE 기능을 가지고 있습니다. 역동적 언어이므로 사용하기가 쉽지 않습니다.

또한 함수가 funcname () ... 유형으로 선언되면 whitout knowing type은 함수가 호출되는 각 줄을 검색해야합니다. 파이썬과 같은 경우에는 funcname 만 알고 있기 때문입니다. 선언에서 def funcname 또는 funcname 함수를 한 번만 검색하십시오.

정적 언어 도구는 일반적으로 의미 검색 기능을 제공합니다. 즉, 텍스트 검색을 수행하지 않고도 특정 기호의 정의 및 참조를 정확하게 찾을 수 있습니다. 예를 들어, Java 프로젝트에 Eclipse를 사용하여 텍스트 편집기에서 기호를 강조 표시하고 마우스 오른쪽 단추로 클릭 한 후 '정의로 이동'또는 '참조 찾기'를 선택하여 이러한 조작 중 하나를 수행 할 수 있습니다. 편집기는 이미 위치를 정확히 알고 있으므로 함수 정의의 텍스트를 검색 할 필요가 없습니다.

그러나 반대로 텍스트로 메소드 정의를 검색하는 것은 실제로 제안한대로 큰 동적 프로젝트에서 제대로 작동하지 않습니다. 이러한 프로젝트에는 같은 이름의 여러 메소드가 쉽게있을 수 있으며 아마도 사용 가능한 도구 중 하나를 명확하게하기 위해 쉽게 사용할 수있는 도구 (일반적으로 이러한 도구를 작성하기가 어렵거나 불가능하기 때문에)는 직접 작성해야합니다.

또한 REPL을 사용하면 입력이 다른 리턴 타입에 대한 함수를 테스트하는 것이 쉽지 않습니다.

정적으로 유형이 지정된 언어에 대한 REPL을 갖는 것은 불가능하지 않습니다. Haskell이 떠오르는 예이지만 다른 정적으로 유형이 지정된 언어에 대한 REPL도 있습니다. 그러나 요점은 정적 언어로 함수의 반환 유형을 찾기 위해 코드를 실행할 필요가 없다는 것입니다. 이는 아무것도 실행하지 않고도 검사로 결정할 수 있습니다.

정적으로 유형이 지정된 언어에서는 선언 된 유형을 알기 위해 몇 줄의 코드를 추가하고 모든 것을 다시 컴파일해야합니다.

이 작업을 수행해야하더라도 모든 것을 다시 컴파일 할 필요는 없습니다 . 대부분의 최신 정적 언어에는 변경된 코드의 일부만 컴파일하는 증분 컴파일러가 있으므로 유형 오류가 발생하면 거의 즉각적인 피드백을 얻을 수 있습니다. 예를 들어 Eclipse / Java 는 계속 입력하는 동안 유형 오류 강조 표시 합니다 .


4
You seem to have a few misconceptions about working with large static projects that may be clouding your judgement.글쎄요, 저는 14 살이고 안드로이드에서 1 년 미만의 프로그램 만하므로 추측 할 수 있습니다.
user6245072

1
IDE가 없어도 Java의 클래스에서 메소드를 제거하고 해당 메소드에 의존하는 것이 있으면 Java 컴파일러는 해당 메소드를 사용하는 모든 행의 목록을 제공합니다. Python에서는 실행 코드가 누락 된 메소드를 호출 할 때 실패합니다. 나는 정기적으로 Java와 Python을 모두 사용하고 있으며 얼마나 빨리 실행할 수 있고 Java가 지원하지 않는 멋진 작업을 수행하기 위해 Python을 좋아하지만 실제로는 Python 프로그램에서 문제가 발생하지 않습니다. (똑바로) 자바. 파이썬에서 리팩토링은 특히 훨씬 어렵다.
JimmyJames

6
  1. 정적 유형의 언어에서는 정적 검사기가 더 쉽습니다.
    • 동적 언어 기능이없는 최소한으로 컴파일하면 런타임에 해결되지 않은 함수가 없습니다. 이는 ADA 프로젝트와 마이크로 컨트롤러의 C에서 일반적입니다. (마이크로 컨트롤러 프로그램은 때때로 수백 kloc과 같이 커집니다.)
  2. 정적 컴파일 참조 검사는 함수 불변의 하위 집합으로, 정적 언어에서 컴파일시 확인할 수도 있습니다.
  3. 정적 언어는 일반적으로 참조 투명성이 더 높습니다. 결과적으로 새로운 개발자는 단일 파일로 뛰어 들어 진행 상황을 이해하고 코드베이스의 모든 이상한 것을 알지 않고도 버그를 수정하거나 작은 기능을 추가 할 수 있습니다.

개발자가 런타임에 핵심 언어 기능을 재정의하는 Javascript, Ruby 또는 Smalltalk와 비교하십시오. 이것은 큰 프로젝트에 대한 이해를 어렵게 만듭니다.

더 큰 프로젝트에는 더 많은 사람들이있을뿐 아니라 더 많은 시간이 있습니다. 모두가 잊어 버리거나 이동할 수있는 충분한 시간입니다.

일화 적으로 지인은 Lisp에서 안전한 "Job For Life"프로그래밍을 가지고 있습니다. 팀을 제외한 누구도 코드 기반을 이해할 수 없습니다.


Anecdotally, an acquaintance of mine has a secure "Job For Life" programming in Lisp. Nobody except the team can understand the code-base.정말 그렇게 나빠요? 그들이 추가 한 개인화가 생산성 향상에 도움이되지 않습니까?
user6245072

@ user6245072 현재 그곳에서 일하는 사람들에게는 유리할 수 있지만, 새로운 사람들을 모집하는 것은 더 어렵습니다. 비주류 언어를 이미 알고 있거나 모르는 언어를 가르치는 데 더 많은 시간이 걸립니다. 이로 인해 프로젝트가 성공할 때 규모가 커지거나 변동에서 회복하기가 더 어려워 질 수 있습니다. 사람들이 이사를 떠나 다른 위치로 승진하게됩니다. 잠시 후 전문가들에게도 불리 할 수 ​​있습니다. 10 년 정도 틈새 언어를 쓴 후에는 새로운 것으로 넘어 가기가 어려울 수 있습니다.
헐크

추적 프로그램을 사용하여 실행중인 Lisp 프로그램에서 단위 테스트를 작성할 수 있습니까? 파이썬 에서처럼 함수를 취하고 인수를 출력하는 수정 된 함수를 반환하는 print_args라는 데코레이터 (부사)를 만들 수 있습니다. 그런 다음 더 쉬운 방법은 sys.set_trace를 사용하는 것이지만 sys.modules의 전체 프로그램에 적용 할 수 있습니다.
aoeu256

@ aoeu256 저는 Lisp 런타임 환경 기능에 익숙하지 않습니다. 그러나 매크로를 많이 사용했기 때문에 일반적인 lisp 프로그래머는 코드를 읽을 수 없었습니다. 매크로가 Lisp에 대한 모든 것을 변경하기 때문에 런타임에 "간단한"작업을 수행하려고 시도 할 수 없습니다.
Tim Williscroft

@TimWilliscroft 이런 종류의 작업을하기 전에 모든 매크로가 확장 될 때까지 기다릴 수 있습니다. Emacs에는 매크로를 인라인 확장 (및 인라인 함수) 할 수있는 많은 단축키가 있습니다.
aoeu256

4

나는 이런 말을 이해하지 못했습니다. 솔직히 말해서 함수의 반환 유형을 선언하더라도 많은 코드 줄을 작성한 후에는 함수를 잊을 수 있으며 잊어 버릴 수 있습니다. 텍스트 편집기로 확인하십시오.

반환 유형을 잊어 버린 것이 아니라 항상 발생합니다. 공구가 반환 유형을 잊었다는 것을 알려주는 기능에 관한 것입니다.

또한 함수가 type funcname()..., whitout knowing type 으로 선언 되면 함수는 호출되는 각 줄을 검색해야합니다 funcname. 파이썬 등에서는 검색 할 수 def funcname있거나 function funcname한 번만 발생하기 때문입니다. 선언에서.

이것은 구문 문제이며 정적 타이핑과는 전혀 관련이 없습니다.

C 패밀리 구문은 전문 도구를 사용하지 않고 선언을 찾으려고 할 때 실제로 비우호적입니다. 다른 언어에는이 문제가 없습니다. Rust의 선언 구문을 참조하십시오.

fn funcname(a: i32) -> i32

또한 REPL을 사용하면 다른 입력으로 반환 유형에 대한 함수를 테스트하는 것이 쉽지 않습니다. 정적으로 유형이 지정된 언어의 경우 코드 줄을 추가하고 선언 된 유형을 알기 위해 모든 것을 다시 컴파일해야합니다.

모든 언어를 해석 할 수 있으며 모든 언어에 REPL이있을 수 있습니다.


따라서 정적으로 유형이 지정된 언어의 장점이 아닌 함수의 반환 유형을 아는 것 외에는 더 큰 프로젝트에서 정적 유형이 실제로 어떻게 도움이됩니까?

추상적 인 방법으로 답변하겠습니다.

프로그램은 다양한 작업으로 구성되며 이러한 작업은 개발자가 가정 한 일부 방식으로 구성됩니다.

일부 가정은 암시적이고 일부는 명시 적입니다. 일부 가정은 근처의 작업과 관련이 있으며, 일부 가정은 다른 작업과 관련이 있습니다. 진리의 가치가 중요한 장소에 가능한 한 명시적이고 표현이 가까울 때 가정을 쉽게 식별 할 수 있습니다.

버그는 프로그램에 존재하지만 어떤 경우에는 유지되지 않는 가정의 표현입니다. 버그를 추적하려면 잘못된 가정을 식별해야합니다. 버그를 제거하려면 프로그램에서 해당 가정을 제거하거나 가정이 실제로 유지되도록 무언가를 변경해야합니다.

가정을 두 가지 종류로 분류하고 싶습니다.

첫 번째 종류는 프로그램의 입력에 따라 유지 될 수도 있고 그렇지 않을 수도있는 가정입니다. 이런 종류의 잘못된 가정을 식별하려면 가능한 모든 프로그램 입력 공간에서 검색해야합니다. 교육받은 추측과 합리적인 사고를 사용하여 문제를 좁히고 훨씬 작은 공간에서 검색 할 수 있습니다. 그러나 여전히 프로그램이 조금만 커지면 초기 입력 공간은 엄청난 속도로 커집니다. 모든 실제적인 목적을 위해 무한한 것으로 간주 될 수 있습니다.

두 번째 종류는 모든 입력에 대해 확실히 적용되거나 모든 입력에 대해 잘못 가정 한 것입니다. 우리는 이런 종류의 가정이 잘못되었다고 판단 할 때 프로그램을 실행하거나 입력을 테스트 할 필요조차 없습니다. 우리가 올바른으로 이런 종류의 가정을 식별 할 때, 우리는 우리가 버그 (추적 할 때 걱정이 덜 의심 하나가 어떤 버그). 따라서 가능한 많은 가정이 이런 종류에 속한다는 점에서 가치가 있습니다.

두 번째 범주에 가정을 두려면 (입력과 상관없이 항상 참 또는 항상 거짓) 가정이 이루어지는 곳에서 최소한의 정보를 사용할 수 있어야합니다. 프로그램의 소스 코드 전체에서 정보가 오래되었습니다 (예를 들어, 많은 컴파일러는 프로 시저 분석을 수행하지 않으므로 대부분의 정보에 대한 호출을 어려운 경계로 만듭니다). 필요한 정보를 최신 상태로 유지할 수있는 방법이 필요합니다 (유효하고 근처에 있음).

한 가지 방법은 가능한 한이 정보의 출처를 정보가 소비되는 장소에 가깝게하는 것이지만 대부분의 사용 사례에는 실용적이지 않을 수 있습니다. 또 다른 방법은 정보를 자주 반복하여 소스 코드에서 관련성을 갱신하는 것입니다.

이미 짐작할 수 있듯이 정적 유형은 소스 코드에 흩어져있는 유형 정보의 신호입니다. 이 정보는 두 번째 범주에서 유형 정확성에 대한 대부분의 가정을 제시하는 데 사용될 수 있습니다. 이는 거의 모든 작업이 유형 호환성과 관련하여 항상 정확하거나 항상 부정확 한 것으로 분류 될 수 있음을 의미합니다.

유형이 잘못되면 분석을 통해 늦지 않고 일찍 버그에주의를 기울여 시간을 절약 할 수 있습니다. 유형이 올 바르면 분석을 통해 버그가 발생하면 유형 오류를 즉시 배제 할 수 있으므로 시간이 절약됩니다.


3

오래된 격언 "쓰레기 수거, 쓰레기 수거"를 기억하십시오. 이것이 정적 타이핑이 방지하는 데 도움이됩니다. 보편적 인 만병 통치약은 아니지만 일상적으로 어떤 종류의 데이터가 수락하고 반환하는지에 대한 엄격함은 올바르게 작업하고 있다는 확신을 가지고 있음을 의미합니다.

따라서 정수를 반환하는 getAnswer 루틴은 문자열 기반 호출에서 정수를 사용하려고 할 때 유용하지 않습니다. 정적 타이핑은 이미 실수를 저지르고 있음을 알려줍니다. (그리고 확실히 그것을 재정의 할 수는 있지만, 당신이하고있는 일을 정확히 알아야하고 캐스트를 사용하여 코드에서 지정해야합니다. 일반적으로, 당신은 이것을하고 싶지 않습니다-해킹 정사각형 구멍에 둥근 못은 결코 잘 작동하지 않습니다)

이제 복잡한 유형을 사용하고, 광석 기능을 가진 클래스를 만들어서 더 많은 것을 취할 수 있습니다. 구조화 된 프로그램은 올바르게 작동하고 유지 관리하기가 훨씬 쉬운 프로그램입니다.


정적 유형 유추 (pylint)를 수행 할 필요가 없으며 동적 유형 유추를 수행 할 수 있습니다. chrislaffra.blogspot.com/2016/12/… 또한 PyPy의 JIT 컴파일러가 수행합니다. 컴퓨터가 인수에 모의 객체를 무작위로 배치하고 오류의 원인을 보는 다른 버전의 동적 형식 유추도 있습니다. 정지 문제는 99 %의 경우 중요하지 않습니다. 너무 많은 시간이 걸리면 알고리즘을 중지하십시오 (Python이 무한 재귀를 처리하는 방식이므로 재귀 제한을 설정할 수 있습니다).
aoeu256
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.