엄범

hidden-features-of-python


```python

def __repr__(self):

    return "[{} ({},{}) {} {}]".format(self.n, self.x, self.y, self.left, self.right)

```

list 안에 들어있는 객체 print 시 주소가 아니라 값들 출력하게 하려면, __repr__을 override


```python

pip install --editable . 

    -e, --editable <path/url>

        Install a project in editable mode (i.e. setuptools “develop mode”) from a local project path or a VCS url.

```


아나콘다에 포함되어 있는 패키지 확인 및 업데이트

```python
> conda list pyqt
> conda update pyqt
```

함수 내에서 전역변수 수정

```python
g = 0

def foo():
    print(g)  # g에 접근은 그냥 된다.
    global g # g를 수정하려면 반드시 이렇게 해줘야 한다.
    g = 3
```

paramiko (docs) 

python으로 SSH를 사용할 수 있는 모듈. server, client 모두 지원한다.

아나콘다에 기본적으로 포함되어 있는 pexpect 라는 모듈도 있다.

둘 중 어느게 더 좋은지는 모르겠음. pexpect의 경우 프롬프트를 자동으로 인식하는 등 약간 휴리스틱이 들어가 있는 듯?


패키지 관리

virtualenv

virtualenv 환경으로 패키지를 외부 환경과 분리해서 설치할 수 있다.

옵션을 안주면 아예 패키지 없는 환경이 설치되고,

``--system-site-packages``옵션을 주면 시스템에 설치되어 있는 패키지들이 virtualenv에도 설치된다.

```bash

$ virtualenv -p python3 {venv_name}

보통 ~/.virtualenvs/{venv_name} 에 설치하는게 관리하기 깔끔

```


conda

conda로도 가능함.




python2와 python3 같이 사용하기

PYTHONPATH 환경변수가 있다면 이를 삭제한다. 이 환경변수가 존재하면 어떤 python을 사용하든 그 Lib 폴더를 참조하게 되어 에러가 발생한다.


PATH 환경변수는 앞에서 부터 참조하므로, 기본으로 사용할 python root path를 먼저 위치시키고,

버전을 지정해 사용할 python root path를 그 다음에 위치시킨다. 

* 이 때 pip같은거 ``py python -m``안쓰고 그냥 사용할거면 Scripts 폴더도 추가해줘야 한다.


버전을 지정해 사용할 python은 `` mklink`` 명령어로 같은 폴더 내에 symlink를 생성하거나, 그냥 복붙해서 사용한다.

* 같은 폴더 내에 위치시키는 이유는 `` PATH``에 등록한 경로가 거기 뿐이기 때문.


사실 환경 변수 등록 안하고 그냥 system32에 `` python3.exe, pip3.exe``로 symlink 생성해도 되기는 하는데,

이렇게 추가하는 경우 모듈이 환경변수에 등록이 안되어 직접 사용이 불가능하기 때문에 모듈이 위치한 경로로 직접 가서 `` python -m module`` 해야 하고 나중에 지우기도 번거롭고 해서, 그냥 `` PATH`` 환경변수에 추가하는 방법이 더 좋은 것 같다.

* 끝에 반드시 `` .exe``를 붙여주어야 한다. 실행할 때는 `` .exe``없이 실행한다.


2to3 -w aaa.py

```bash
λ 2to3 -w UCT.py
λ ls
UCT.py  UCT.py.bak
```
python2로 작성된 파일을 3으로 수정하려면 2to3 모듈을 사용한다. -w옵션을 주면 자동으로 백업파일 생성하면서 3로 변경해준다.
변경 이후 발생하는 에러는 대부분 문자열, 바이트 인코딩 관련 오류이므로, ``python b' '`` 또는 .``python encode()`` 메소드 등으로 적절히 해결한다.





Python

파이썬은 동적 언어(스크립트 언어)다. 이는 변수 타입을 정해놓지 않으며 언제든지 바뀔 수 있음을 의미한다.

자바나 C 등은 정적 언어로 타입을 선언해줘야한다.


인터프리터 기반이다. 그래서 인터프리터의 속도 의존도가 크며, 당연히 컴파일된 정적 언어보다 느리다.

http://benchmarksgame.alioth.debian.org/u32/python.html

보면 많이 느린 부분도 있고, 비슷한 부분도 있다. 그래서 속도가 중요한 내부 로직은 보통 C로 바인딩하고,(cpython이 C를 바탕으로 만들어졌기 때문.) 자주 변경될 수 있어 그때그때 빠르게 코딩해야 하는 표면을 python으로 처리하면 좋다.


Productivity

파이썬을 사용하면서 느낀 파이썬이 쉽다, 생산성이 높다고 하는 이유는 

1) 다양한 라이브러리를 제공하며

2) 대충 짜도 돌아가기 때문이다. (추상화가 잘 되어 있다.)

C같은 경우 로우레벨이나 메모리에 관한 부분을 생각하며 코딩해야 하지만 파이썬은 인터프리터가 다 알아서 해주니까 추상 레이어가 깊다고 할 수 있다. 

예를들어 자바의 경우 파일을 읽으려면 여러 reader와 buffer 객체를 붙이는 등의 작업이 필요하지만, 파이썬은 그냥 f.read()하면 된다.

이런 경우 신경쓸 부분이 적어져 빠르게 짤 수 있겠지만, 대형 프로젝트에 사용하려면 오히려 프로그래머에게 투명하게 제공되는 추상 레이어와 인터프리터에 대한 깊은 이해가 필요하기 때문에 오히려 오래걸릴 수 있다.

또한 한가지 목적을 달성하는데 여러가지 방법을 제공하는건 편리하지만, 최적화를 위해 그 중에 최선의 방법을 찾는 노력이 추가로 들어가야 한다는 것을 의미하기도 한다. 그리고 그렇게 찾은 최선의 방법도 C보다 느리다.

그래서, 파이썬에서 신뢰도를 추구하느라 스트레스 받지는 말자고 다짐했다.


Evaluation strategy

파이썬은 call by object reference다.

immutable object를 넘길 경우 ( 정수나, 정수를 참조하는 변수 ) call by value처럼 동작한다.

mutable object를 넘길 경우 (리스트 등) call by reference처럼 동작한다.