Python Code Snippets
Unzip
Ref: Unzipping files in Python
python
import zipfile
with zipfile.ZipFile(path_to_zip_file, 'r') as zip_ref:
zip_ref.extractall(directory_to_extract_to)Stdin
python
import sys
for line in sys.stdin:
print(line.strip())Class to JSON
Just for debugging and testing.
python
import inspect
def marshal(v):
if v is None:
return v
for tp in [int, float, str, bool, long]:
if isinstance(v, tp):
return v
if isinstance(v, unicode):
return v.encode('utf-8')
if isinstance(v, dict):
return marshal_dict(v)
if isinstance(v, list) or isinstance(v, tuple):
return marshal_list(v)
if inspect.isclass(v):
return marshal_class(v)
raise RuntimeError('type: %s' % (type(v))
def marshal_class(obj):
''' marshal class into json serializable dict '''
ret = {}
for name, value in inspect.getmembers(obj):
if name.startswith('_'):
continue
if inspect.ismethod(value):
continue
if inspect.isbuiltin(value):
continue
ret[name] = marshal(value)
return ret
def marshal_dict(obj):
''' marshal dict into json serializable dict'''
return {k: marshal(obj[k]) for k in obj}
def marshal_list(obj):
''' marshal list or tuple into json serializable list'''
return [marshal(v) for v in obj]Optional Dependency
setup.py:
python
setup(
# ...
extras_require={
'plotter': ['matplotlib'],
'full': ['matplotlib', 'tensorflow'],
},
)bash
pip install pkg[plotter]程式內用 try: import ... except ImportError: 判斷是否可用。pyproject.toml 對應的是 [project.optional-dependencies]。
原文:Pip Install Optional Dependency
可中斷的 Sleep
time.sleep 無法提前中斷(3.5+ 被 signal 打斷後還會繼續睡完),改用 threading.Event.wait:
python
import signal
import threading
stop = threading.Event()
signal.signal(signal.SIGTERM, lambda *_: stop.set())
while not stop.is_set():
do_job()
stop.wait(60) # set() 時立刻返回