파일 크기 확인하는 법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| ### Simple way
import os
b = os.path.getsize("/path/aaa.txt")
### Another way 1
import os
statinfo = os.stat("somefile.txt")
statinfo.st_size
### Another way 2
import os
with open("somefile.txt", 'r') as f:
f.seek(0, os.SEEK_END)
size = f.tell()
### Abstract Class
필요 Module을 Import
```python
import abc
### 사용성을 위해 다음의 코드가 추천됨
from abc import ABC, abstractmethod, ABCMeta
|
Abstract Class 구현
1
2
3
4
5
6
7
8
9
10
11
| class AbstractClassExample(ABC):
__metaclass__ = ABCMeta
def __init__(self, value):
self.value = value
super().__init__()
@abstractmethod
def do_something(self):
pass
|
구현된 Abstract Class 사용
1
2
3
4
5
6
7
8
9
10
11
| class ClassExample(AbstractClassExample):
def __init(self):
super().__init__()
### Abstract Method를 구현하지 않으면 Error 발생
def do_something(self):
print("something")
### Method Overloading 개념도 가능
def do_something(self, data):
print(data)
|
정적 타입
1
2
| def typing_example(param_1: int, param_2: str="default") -> str:
return "example"
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| #### 전체 자리수=8, 소수점은 2자리까지 반올림
print("num: {:8.2f}".format(num))
#### 왼쪽 정렬 및 빈 공간 0으로 채우기
print("num: {:0<8.2f}".format(num))
#### 오른쪽 정렬 및 빈 공간 0으로 채우기
print("num: {:0>8.2f}".format(num))
#### 오른쪽 정렬 및 빈 공간 *로 채우기
print("num: {:*>8.2f}".format(num))
print("="*20)
s = "Taelim Hwang"
print(s)
print("{:|>30s}".format(s))
print("{:|<30s}".format(s))
|
Hash 사용하기
내장함수 hash의 경우, 3.4 버전 이상부터 Process에 따라 다른 Hash Value가 return 되므로 사용 지양
1
2
3
4
5
6
| python -c "print(hash('123'))"
8180009514858937698
python -c "print(hash('123'))"
-3358196339336188655
python -c "print(hash('123'))"
-5852881486981464238
|
hashlib 사용
1
2
3
4
5
6
| import hashlib
### sha256, sha1, md5 등 hash algorithm 선택
### input value는 encode()를 통해 unicode로 변환되어야 한다
### hexdigest()로 16진수의 hex값으로 hash value 출력
hsahlib.sha256(input_value.encode()).hexdigest()
|
String split 시, 뒤의 1개만 분리하고 싶을 경우
1
2
3
4
| "a b c,d,e,f".rsplit(',', 1)
### Return value
['a b c,d,e', 'f']
|
Function을 argument로 전달하면서 해당 function의 argument 또한 넘기고 싶을 경우
1
2
3
4
5
6
7
8
9
10
11
12
| def a(x, y):
print x, y
def b(other, function, *args, **kwargs):
function(*args, **kwargs)
print other
b('world', a, 'hello', 'dude')
### Return value :
hello dude
world
|
Time check하는 decorator 짜기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| ### 정의
def check_time(function):
def wrapper_func(*args, **kwargs):
start_time = datetime.datetime.now()
result = function(*args, **kwargs)
end_time = datetime.datetime.now()
logger.set_log('DEBUG', "Time elapsed {check_time}".format(check_time=end_time - start_time), extra={'classAndFunc': function.__qualname__})
return result
return wrapper_func
### 사용법 1 : With decorator
@check_time
def func():
mssql_conn = MSSQLConnector(region='qv25')
mssql_conn.get_data_query("SELECT * FROM displays_history")
func()
### 사용법 2 : 정의된 함수를 측정하고 싶을 경우
check_time(func())
|
Class 및 Function name 확인하기
1
2
3
4
5
6
7
8
9
10
11
12
| def my_function():
pass
class MyClass(object):
def method(self):
pass
print(my_function.__name__) ### gives "my_function"
print(MyClass.method.__name__) ### gives "method"
print(my_function.__qualname__) ### gives "my_function"
print(MyClass.method.__qualname__) ### gives "MyClass.method"
|
Logging
기본 사용법
추가로 표시하고 싶은 값이 있을 경우
1
2
3
4
5
| FORMAT = '%(asctime)-15s %(clientip)s %(user)-8s %(message)s'
logging.basicConfig(format=FORMAT)
d = {'clientip': '192.168.0.1', 'user': 'fbloggs'}
logger = logging.getLogger('tcpserver')
logger.warning('Protocol problem: %s', 'connection reset', extra=d)
|
Coroutine(asyncio)
1
| https://iscinumpy.gitlab.io/post/a-simple-introduction-to-asyncio/
|
Integer to String 시 앞부분 0으로 채우기
1
| str(1).zfill(2) ### '01'
|
프로젝트의 구조
내용 추가 필요
파이썬이 느린 이유
http://jakevdp.github.io/blog/2014/05/09/why-python-is-slow/
list1에 있는 요소가 다른 list2에 있는지 확인하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| ### List of string
list1 = ['Hi' , 'hello', 'at', 'this', 'there', 'from']
### List of string
list2 = ['there' , 'hello', 'Hi']
### check if list1 contains all elements in list2
result = all(elem in list1 for elem in list2)
if result:
print("Yes, list1 contains all elements in list2")
else :
print("No, list1 does not contains all elements in list2"
### check if list1 contains any elements of list2
result = any(elem in list1 for elem in list2)
if result:
print("Yes, list1 contains any elements of list2")
else :
print("No, list1 contains any elements of list2")
|
Traceback 사용을 통한 exception handling
1
2
3
4
5
| import traceback
try:
<blah>
except IndexError:
traceback.print_exc()
|
Super class 변수 참조
1
2
3
4
5
6
7
8
9
10
| class PostgreSQLConnector(MSSQLConnector):
### MSSQLConnector 클래스 상속 후 사용한다
def __init__(self, db_config_dir: str="configuration/postgresql_config.json", region: str="kr"):
super().__init__(db_config_dir=db_config_dir, region=region, driver='{PostgreSQL Unicode}')
if self.conn_obj is None:
raise InitConnectorError(PostgreSQLConnector)
### 위의 예제에서 conn_obj attribute는 Super class에서 생성 시 할당되는 부분이다
### 이를 하위 child class에서 사용하려면 super().conn_obj 가 아니라
### self.conn_obj로 참조하면 된다
|
Package 만드는 법
내용 추가
참조 링크
Python ABC(Abstract Base Class)
Abstract Classes
정적 타입 선언
Python 출력 시 formatting
파이썬 프로젝트의 구조
프로세스에 따른 hash 결과가 다르다
Logging
Get class and function name
Asyncio
list a에 있는 요소가 다른 list b에 있는지 확인하기
Super class attribute 참조
Default arguments with *args and **kwargs