program tip

대규모 개발에 Python을 어떻게 사용할 수 있습니까?

radiobox 2020. 12. 10. 19:46
반응형

대규모 개발에 Python을 어떻게 사용할 수 있습니까?


Python의 대규모 개발, 특히 대규모 코드 기반을 유지하는 방법에 대해 배우고 싶습니다.

  • 메서드의 시그니처를 비 호환성으로 변경하면 해당 메서드가 호출되는 모든 위치를 어떻게 찾습니까? C ++ / Java에서 컴파일러는 당신을 위해 그것을 찾을 것입니다. 파이썬에서 어떻게 수행합니까?

  • 코드 내부에서 변경을 수행 할 때 조회 할 정적 유형이 없기 때문에 인스턴스가 제공하는 작업을 어떻게 알 수 있습니까?

  • 입력 오류 (오타)를 어떻게 처리 / 방지합니까?

  • UnitTest가 정적 유형 검사의 대체품으로 사용됩니까?

짐작할 수 있듯이 거의 정적으로 형식화 된 언어 (C ++ / Java)로만 작업했지만 더 큰 프로그램을 위해 Python을 사용해보고 싶습니다. 하지만 오래 전에 동적으로 타이핑 된 클리퍼 (dBase) 언어에 대해 매우 나쁜 경험을했습니다.


아무도 pychecker, pylint 및 이와 유사한 도구를 지적하지 않았기 때문에 pychecker와 pylint는 잘못된 가정 (함수 서명, 객체 속성 등)을 찾는 데 도움이되는 도구입니다. 컴파일러가 찾을 수있는 모든 것을 찾지 못할 것입니다. 정적으로 형식화 된 언어-하지만 그러한 언어에 대한 컴파일러도 찾을 수없는 문제를 찾을 수 있습니다.

Python (및 동적으로 입력되는 언어)은 발생할 가능성이있는 오류와 오류를 감지하고 수정하는 방법이 근본적으로 다릅니다. 분명한 단점과 장점이 있지만, 많은 사람들 (나를 포함하여)은 Python의 경우 코드 작성 용이성 (그리고 구조적으로 건전하게 만드는 용이성)과 API 호환성 깨지 않고 코드 수정 (새로운 선택적 인수 추가)이라고 주장 할 것입니다. , 동일한 메소드 및 속성 세트를 가진 다른 객체를 제공하면 대규모 코드베이스에 적합합니다.


스크류 드라이버를 망치로 사용하지 마십시오.

Python은 정적으로 형식화 된 언어가 아니므로 그렇게 사용하지 마십시오.

특정 도구를 사용할 때 빌드 된 도구를 사용합니다. Python의 경우 다음을 의미합니다.

  • 덕 타이핑 : 유형 검사 없음. 행동 만이 중요합니다. 따라서이 기능을 사용하도록 코드를 설계해야합니다. 좋은 디자인은 일반적인 서명, 구성 요소 간 의존성 없음, 높은 추상화 수준을 의미합니다. 따라서 변경 사항이있는 경우 나머지 코드를 변경할 필요가 없습니다. 파이썬은 그것이 구축 된 것에 대해 불평하지 않을 것입니다. 유형은 문제가 아닙니다.

  • 거대한 표준 라이브러리 . 직접 코딩하지 않은 표준 기능을 사용하는 경우 프로그램의 모든 호출을 변경할 필요가 없습니다. 그리고 파이썬에는 배터리가 포함되어 있습니다. 나는 그것들을 매일 발견하고있다. 나는 시작할 때 사용할 수있는 모듈의 수를 몰랐고 모두와 같이 기존의 것을 다시 작성하려고했습니다. 괜찮아, 처음부터 제대로 할 수는 없어.

Java, C ++, Python, PHP, Erlang 등을 같은 방식으로 작성하지 않습니다. 많은 다른 언어를위한 공간이 있고 같은 일을하지 않는 이유입니다.

단위 테스트는 대체가 아닙니다

단위 테스트는 모든 언어로 수행해야합니다. 가장 유명한 단위 테스트 라이브러리 ( JUnit )는 Java 세계에서 온 것입니다!

이것은 유형과 관련이 없습니다. 다시 행동을 확인합니다. 회귀 문제를 방지합니다. 고객이 궤도에 오르고 있는지 확인합니다.

대규모 프로젝트를위한 Python

언어, 라이브러리 및 프레임 워크는 확장되지 않습니다. 아키텍처는 그렇습니다.

견고한 아키텍처를 설계하고 빠르게 발전시킬 수 있다면 확장 될 것입니다. 단위 테스트는 자동 코드 검사에도 도움이됩니다. 그러나 그들은 단지 안전망 일뿐입니다. 그리고 작은 것들.

Python은 일부 우수 사례를 적용하고 많은 일반적인 디자인 패턴이 내장되어 있기 때문에 대규모 프로젝트에 특히 적합합니다. 그러나 다시 말하지만, 설계되지 않은 용도로 사용하지 마십시오. 예 : Python은 CPU 집약적 인 작업을위한 기술이 아닙니다.

거대한 프로젝트에서는 어쨌든 여러 가지 기술을 사용할 가능성이 큽니다. A와 SGBD (프랑스어 DBMS )과 템플릿 언어, 또는 다른. 파이썬도 예외는 아닙니다.

빠른 속도가 필요한 코드 부분에 C / C ++를 사용하고 싶을 것입니다. 또는 Tomcat 환경 에 맞는 Java . 몰라, 상관 없어. 파이썬은 이것들과 잘 어울릴 수 있습니다.

결론으로

내 대답이 약간 무례하게 느껴질 수 있지만 오해하지 마십시오. 이것은 매우 좋은 질문입니다.

많은 사람들이 오래된 습관을 가지고 파이썬을 찾습니다. 나는 파이썬처럼 자바를 코딩하려고 노력했다. 당신은 할 수 있지만 최선을 다할 수는 없습니다.

Python으로 플레이했거나 플레이하고 싶다면 훌륭합니다! 훌륭한 도구입니다. 하지만 정말 도구 일뿐입니다.


오픈 소스 파이썬 "Guitar Hero"클론 인 "Frets On Fire"를 수정 한 경험이 있습니다.

내가보기에 파이썬은 정말 대규모 프로젝트에 적합하지 않습니다.

나는 개발 시간의 상당 부분을 호환되지 않는 유형의 할당과 관련된 문제를 디버깅하는 데 소비하고 있음을 발견했습니다. 정적 유형 언어가 컴파일 타임에 쉽게 드러 낼 수있는 것입니다. 또한 유형이 런타임에 결정되기 때문에 현재보고있는 매개 변수의 유형이 무엇인지 모르기 때문에 기존 코드를 이해하는 것이 더 어려워집니다.

그 외에도 __getattr__내장 함수로 이름 문자열을 사용하여 함수를 호출하는 것은 일반적으로 다른 프로그래밍 언어보다 Python에서 더 일반적이므로 특정 함수에 대한 호출 그래프를 가져 오는 것이 다소 어렵습니다 (일부에서는 해당 이름으로 함수를 호출 할 수 있지만 정적으로 입력 된 언어도 마찬가지입니다.)

저는 Python이 소규모 소프트웨어, 빠른 프로토 타입 개발 및 기존 프로그램을 함께 붙이는 데 정말 빛난다 고 생각하지만, 이러한 유형의 프로그램에서 유지 관리가 진짜 문제가되고 제 생각에는 파이썬을 대규모 소프트웨어 프로젝트에 사용하지 않을 것입니다. 상대적으로 약합니다.


내 0.10 EUR :

'프로덕션'상태에 여러 개의 파이썬 응용 프로그램이 있습니다. 우리 회사는 자바, C ++ 및 파이썬을 사용합니다. 이클립스 IDE (파이썬 용 pydev)로 개발합니다.

unittests는 문제의 핵심 솔루션입니다. (C ++ 및 Java에도 해당)

덜 안전한 "동적 타이핑"세계는 코드 품질에 대해 덜 부주의하게 만들 것입니다.

방법 :

대규모 개발은 단일 언어를 사용한다는 의미가 아닙니다!

대규모 개발은 종종 문제에 특정한 소수의 언어를 사용 합니다 .

그래서 나는 망치 문제에 동의합니다 :-)


추신 : 정적 타이핑 및 파이썬


파이썬에서 상당히 큰 시스템을 유지하는 데 도움이 된 몇 가지 항목이 있습니다.

  • 코드를 레이어로 구성하십시오. 즉, 별도의 비즈 로직, 프리젠 테이션 로직 및 지속성 레이어. 이러한 계층을 정의하는 데 약간의 시간을 투자하고 프로젝트의 모든 사람이 참여하도록합니다. 대규모 시스템의 경우 특정 개발 방식으로 강제하는 프레임 워크를 만드는 것도 중요 할 수 있습니다.

  • 테스트가 중요합니다. 단위 테스트가 없으면 다른 언어보다 관리 할 수없는 코드베이스가 몇 배 더 빠릅니다. 단위 테스트는 종종 충분하지 않다는 점을 명심하십시오. 주요 변경 후 신속하게 실행할 수있는 몇 가지 통합 / 수락 테스트가 있는지 확인하십시오.

  • Fail Fast 원칙을 사용하십시오 . 코드가 취약하다고 생각되는 경우에 대한 주장을 추가하십시오.

  • 문제를 신속하게 탐색하는 데 도움이되는 표준 로깅 / 오류 처리 기능이 있습니다.

  • Use an IDE( pyDev works for me) that provides type ahead, pyLint/Checker integration to help you detect common typos right away and promote some coding standards

  • Carefull about your imports, never do from x import * or do relative imports without use of .

  • Do refactor, a search/replace tool with regular expressions is often all you need to do move methods/class type refactoring.


Incompatible changes to the signature of a method. This doesn't happen as much in Python as it does in Java and C++.

Python has optional arguments, default values, and far more flexibility in defining method signatures. Also, duck typing means that -- for example -- you don't have to switch from some class to an interface as part of a significant software change. Things just aren't as complex.

How do you find all the places where that method is being called? grep works for dynamic languages. If you need to know every place a method is used, grep (or equivalent IDE-supported search) works great.

How do you find out what operations an instance provides, since you don't have a static type to lookup?

a. Look at the source. You don't have the Java/C++ problem of object libraries and jar files to contend with. You don't need all the elaborate aids and tools that those languages require.

b. An IDE can provide signature information under many common circumstances. You can, easily, defeat your IDE's reasoning powers. When that happens, you should probably review what you're doing to be sure it makes sense. If your IDE can't reason out your type information, perhaps it's too dynamic.

c. In Python, you often work through the interactive interpreter. Unlike Java and C++, you can explore your instances directly and interactively. You don't need a sophisticated IDE.

Example:

  >>> x= SomeClass()
  >>> dir(x)

How do you handle/prevent typing errors? Same as static languages: you don't prevent them. You find and correct them. Java can only find a certain class of typos. If you have two similar class or variable names, you can wind up in deep trouble, even with static type checking.

Example:

class MyClass { }
class MyClassx extends MyClass { }

A typo with these two class names can cause havoc. ["But I wouldn't put myself in that position with Java," folks say. Agreed. I wouldn't put myself in that position with Python, either; you make classes that are profoundly different, and will fail early if they're misused.]

Are UnitTest's used as a substitute for static type checking? Here's the other Point of view: static type checking is a substitute for clear, simple design.

I've worked with programmers who weren't sure why an application worked. They couldn't figure out why things didn't compile; the didn't know the difference between abstract superclass and interface, and the couldn't figure out why a change in place makes a bunch of other modules in a separate JAR file crash. The static type checking gave them false confidence in a flawed design.

Dynamic languages allow programs to be simple. Simplicity is a substitute for static type checking. Clarity is a substitute for static type checking.


My general rule of thumb is to use dynamic languages for small non-mission-critical projects and statically-typed languages for big projects. I find that code written in a dynamic language such as python gets "tangled" more quickly. Partly that is because it is much quicker to write code in a dynamic language and that leads to shortcuts and worse design, at least in my case. Partly it's because I have IntelliJ for quick and easy refactoring when I use Java, which I don't have for python.


The usual answer to that is testing testing testing. You're supposed to have an extensive unit test suite and run it often, particularly before a new version goes online.

Proponents of dynamically typed languages make the case that you have to test anyway because even in a statically typed language conformance to the crude rules of the type system covers only a small part of what can potentially go wrong.

참고URL : https://stackoverflow.com/questions/236407/how-can-i-use-python-for-large-scale-development

반응형