'Programming/Python'에 해당하는 글 6건

파이썬에서는 문자열을 표시하는 큰다옴표(") 나 따옴표(') 앞에 인코딩을 표시하는 u, b, r 등의 접두사가 붙는 것을 볼 수 있다. 기본은 u(UTF-8) 이며, 바이너리는 b(binary), 원시 문자열은 r(raw) 를 사용한다. 


파이썬 3.6 부터는 이스케이프 시퀀스(\n, \t, \\, ...) 가 아닌 백슬러시 문자셋을 사용하면 DeprecationWarning 를 표시한다. 현재는 deprecate 지만 곧 SyntaxError 가 될 것이다. 이스케이프 문자(\)를 포함하는 이스케이프 시퀀스, 경로나 정규 표현식 등을 표현할 때는 원시 문자열인 r 을 사용한다.


# Anti-pattern
regex = '\.png$'
 
# Best practice
regex = r'\.png$'
cs





WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

pip 로 특정 패키지 설치시 Visual C++ 컴파일러를 요구하는 오류 메시지가 발생할 수 있다.


error: Microsoft Visual C++ 14.0 is required. Get it with "Build Tools for Visual Studio": https://visualstudio.microsoft.com/downloads/


하지만 링크를 따라가면... Visual C++ 14.0 에 대응하는 Visual Studio 버전이 뭔지를 알아야...ㅋㅋ 윈도우 계열 개발을 해본 적이 없어서 참 어리버리하구용... 모를 땐 최신버전이지... 하고 Visual Studio 2019 Build Tools 를 깔으려 했더니 6.4G 필요하단다... ㅡ.ㅡ 



파이썬 사이트(https://wiki.python.org/moin/WindowsCompilers)에 보면 Visual Studio 버전별 컴파일러를 잘 설명해 놨다.


Microsoft Visual C++ 14.2 standalone: Build Tools for Visual Studio 2019 (x86, x64, ARM, ARM64)

Microsoft Visual C++ 14.2 with Visual Studio 2019 (x86, x64, ARM, ARM64)

Microsoft Visual C++ 14.1 standalone: Build Tools for Visual Studio 2017 (x86, x64, ARM, ARM64)

Microsoft Visual C++ 14.1 with Visual Studio 2017 (x86, x64, ARM, ARM64)

Microsoft Visual C++ 14.0 standalone: Visual C++ Build Tools 2015 (x86, x64, ARM)

Microsoft Visual C++ 14.0 with Visual Studio 2015 (x86, x64, ARM)

Microsoft Visual C++ 10.0 standalone: Windows SDK 7.1 (x86, x64, ia64)

Microsoft Visual C++ 10.0 with Visual Studio 2010 (x86, x64, ia64)





얘도 뭐... 3G 이긴 한데...


만약 setuptools 패키지 버전이 설치 요건보다 낮다면, 호환성 향상을 위해 setuptools 를 업그레이드 해야 한다.


> pip install --upgrade setuptools
cs


Python... 다른 언어들하고 호환되는 건 너무 좋은데 뭐 이렇게 필요한게 많냐...




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

_ underscore

Programming/Python 2020. 11. 16. 21:31

파이썬에서 언더스코어(_)의 기능은 조금 특별하다. 언패킹에서의 예제에서 홀로 쓰여있는 언더스코어를 보고 조금 더 검색해 봤는데, 함수나 변수에 언더스코어를 사용하여 private 처럼 설정이 가능하다는 것이 새롭다. 참고로 파이썬에서는 C++ 이나 JAVA 처럼 private/protected/public 등의 키워드를 사용하여 리소스 접근 제어를 완벽하게 지원하지 않지만 언더스코어를 사용하여 효과적으로 사용할 수 있다.



언더스코어(_)의 기능


1. 인터프리터에서 마지막 표현식의 값을 불러올 때


>>> 20 
20 
>>> _ + 3 
23
cs



2. 자리는 채워야 하지만 그 값을 무시해도 상관없을 때


# unpacking
x, _, y = (123)
 
# index
for _ in range(10):
    do_something()
 
for _, val in list_of_tuple:
    do_something()
cs



3. 변수나 함수 선언시 사용


파이썬에서 변수나 함수를 private 으로 지정하는 방법으로 언더스코어(_) 를 사용할 수 있다.

변수나 함수 선언시 이름 앞에 언더스코어(_)를 붙이면 private 로 지정되어, 모듈을 from import 할 때 private 변수나 함수들은 import 되지 않을 것이며, __all__ 에 지정되어 있으면 다른 모듈에서 직접 호출할 수 있다.


이름 앞에 싱글 언더스코어(_single_leading_underscore)

- 해당 변수나 함수를 가진 모듈을 from class_file import * 로 호출하면, import 때 무시되어 사용할 수 없다.

- 모듈 내부에서만 사용가능한 private 역할로 사용할 수 있지만, import 로 직접 호출하면 사용 가능하다.


이름 뒤에 싱글 언더스코어(single_trailing_underscore_) : protected

- 내장함수 및 예약어 등의 이름을 사용하고 싶을때 충돌을 방지하기 위해 사용한다.


이름 앞에 더블 언더스코어(__double_leading_underscore) : private

- 인터프리터에서 파싱할 때 그 이름을 그대로 사용하지 않고 내부 규칙에 의해 임의의 이름이 붙여짐(mangle).

- 파이썬에서의 맹글링은 _ClassName__method 가 된다.

- 기존 이름에 직접 접근할 수 없으므로, 주로 클래스 내부에서만 사용한다.


이름 앞뒤에 더블 언더스코어(__double_leading_and_trailing_underscore__)

- __init__ 같은 매직 메소드를 표현할 때 사용한다.

- 사용자 정의도 가능하지만 거의 사용하지 않는다.



4. 숫자 리터럴(Numeric Literals) 에서의 가독성


숫자를 구분하며 가독성을 높일 때(실제값에 영향을 주지 않음)


>>> 1_000_000_000_000_000
1000000000000000
 
>>> 0x_FF_FF_FF_FF
4294967295
cs



5. 국제화(i18n), 지역화(l10n)  함수에 사용


i18n/l10n 라이브러리인 gettext 와 웹프레임워크인 Django 의 공식 문서에서도 언더스코어(_)를 사용하고 있다.


import gettext
 
gettext.bindtextdomain('myapplication''/path/to/my/language/directory')
gettext.textdomain('myapplication')
= gettext.gettext
 
# ...
 
print(_('This is a translatable string.'))
cs


from django.utils.translation import ugettext as _
from django.http import HttpResponse
 
def translate_view(request):
    translated = _('This string will be translated.')
    return HttpResponse(translated)
cs




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,
v = [x for x in iterable if x]
cs


list 안에다가 for 문을 때려박는 요상한 문법을 보았다. 대충봐도 for 문을 이용해 list 안에 요소를 넣는다는 것은 알겠는데 굳이? 아무래도 한줄에 쓰여 있으니 간략해 보이기도 하지만 제어문이 길어질 경우 가독성은 어째? 간단할 때 쓰면, 아니 복잡하더라도 익숙해지면 나쁘지 않을 것 같다.


저것을 풀어보려니,


v = []
for x in iterable:
    if x:
        v.append(x)
cs


맞나? 이렇게 보니 왠지 한 줄로 써야할 것 같다.



Comprehension


이렇게 list(), dictionary[], set{} 의 요소 자리에 반복문이나 조건문을 사용하여 iterable 한 객체를 생성하는 기능을 Comprehension 이라 한다.

  • List Comprehension (LC)
  • Dict Comprehension (DC)
  • Set Comprehension (SC)


iterable 이란 반복 가능한 자료형을 말하며 collections.Iterable 에 속한 instance 로,

list, tuple, dictionary, set, range bytes, str 등이 있다.


[x * 2 for x in iterable if x] 대충 이러한 형식에서,


첫번재 x 가 요소로 들어갈 변수자리이며 바로 각종 연산이 가능하다.

그 뒤에 for 문과 if/else 문을 중첩으로 사용하여 조금 복잡한 연산도 가능하지만... 그냥 복잡해 보이기만 함 ㅋㅋ


예를 들면 요롷게 긴~


[(x, y, z) for x in range(1, 30) for y in range(x, 30) for z in range(y, 30) if x**2 + y**2 == z**2]




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

예제에서 텍스트 파일을 binary 로 읽길래, 잠시 파일 처리에 대해 살펴봤다.

파이썬에서 텍스트 파일을 읽을 때(open) 사용하는 옵션 중 text(rt:default) 모드와 binary(rb) 모드가 있다.


말 그대로,

- text 모드는 텍스트 파일 객체로 읽어오는 것이고,

- binary 모드는 텍스트 파일을 바이너리 객체로 인코딩하여 읽어오는 것이다.

ㅋㅋ...;;;


두 모드에 대해 조금더 알아보면...


Text mode

- 이 모드로 파일을 open 하면 io.IObase 클래스를 상속받은 텍스트 파일 객체(io.TextIOWrapper)를 생성한다.

- 정해진 인코딩(encoding)으로 디코딩(decoding)이 발생하며 파일의 내용은 문자열 str 로 반환된다.

- 텍스트 인코딩을 지정하지 않을시 플랫폼의 기본 인코딩을 따른다.

- text 파일이 아닌 파일(binary=non-text)을 이 모드로 열면 글자가 깨져보여 내용을 알아볼 수 없다.


Binary mode

- 이 모드로 파일을 open 하면 io.IObase 클래스를 상속받은 바이너리 파일 객체(io.BufferedReader)를 생성한다.

- 디코딩 없이 파일의 내용은 1바이트 크기의 배열인 bytes 객체로 반환된다.

- binary 파일이 아닌 text 파일의 경우 bytes 객체로 인코딩하는 과정을 거친다.

- text 파일을 포함한 모든 binary 파일을 처리할 수 있다.

- text mode 에 비해 디스크 및 메모리가 적게 소모되며 속도가 빠르다.



예를 들어,


한글 ㅋㅋ
abc    1    def
오예
cs


위 내용처럼 한글과 영문 등이 혼합된 utf-8 로 인코딩된 파일을 binary 모드로 불러온다면


lines = open("file.txt""rb")
= 0
for line in lines:
    #line = line.decode('utf-8').strip()
    i = i + 1
    print(line)
cs


b'\xed\x95\x9c\xea\xb8\x80 \xe3\x85\x8b\xe3\x85\x8b\r\n'
b'abc\t1\tdef\r\n'
b'\xec\x98\xa4\xec\x98\x88'
cs


위 결과처럼 파이썬에서는 b로 시작하는 작은/큰따옴표 형태를 bytes 객체라고 한다. 위에서도 아스키 문자와 이스케이프 시퀀스(탭, 개행 등)를 제외하고는 binary 형태로 출력된 것을 볼 수 있다. 이 상태에서 주석을 해제하면 다시 utf-8 로 디코딩 된 문자열로 내용을 확인할 수 있다.


근데 왜 예제에서는 텍스트 파일을 바이너리 모드로 읽어왔을까...


모르겠다...ㅎㅎ; 텍스트 문서를 읽을 때 어떤 모드를 사용해도 별 문제는 없는 것 같다. 다만 어떤 모드를 사용하든 문서에 한글 등이 포함되어 있다면 인코딩을 알고 있어야 한다. 한글 Windows 의 경우 EUC-KR 을 확장한 CP949 를 사용할 것이며, 요즘은 ANSI 와의 하위호환성이 보장된 UTF-8 를 주로 사용한다.(다국어를 모두 사용할 수 있음) 편의를 위해 만들어 놨으니 text 파일은 text 모드로 binary 파일은 binary 로 처리하면 되지 않을까 싶다...




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,