[Python] Pickle์ ๋ํ ์คํด์ Can’t Pickle local object Error ํด๊ฒฐ
๐ 5 mins read
# Pickle์ ์คํด
ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ฌ์ฉํ๋ค ๋ณด๋ฉด, ์ง์ ์ฌ์ฉํ์ง ์๋๋ผ๋, pickle์ ์ด๋ป๊ฒ๋ ๋ง๋ ์๋ฐ์ ์๋๋ฐ, ๋จ์ํ ํ์ผ์ด๋ ์ค๋ธ์ ํธ๋ฅผ ์ ์ฅํ๊ณ ๋ถ๋ฌ์ฌ ๋๋ฟ๋ง ์๋๋ผ ์ด๋ค ๊ฐ์ฒด๋ฅผ ํ๋ก์ธ์ค ๊ฐ์ ๊ณต์ ํ๊ฑฐ๋ ์ ๋ฌํ ๋๋ ์ฐ์
๋๋ค. ์ด๋ pickle์ ์๋ฆฌ๋ฅผ ๋ชจ๋ฅผ ๊ฒฝ์ฐ Attribute Error ํน์ PicklingError๋ฅผ ๋ค์๊ณผ ๊ฐ์ ํํ๋ก ๋ง๋๋ฉด ๋นํฉ์ค๋ฌ์ธ ์ ์์ต๋๋ค. (๋ฌธ์ ์๋ ๊ฑฐ ๊ฐ์๋ฐ ๋์ฒด ์!?)
PicklingError: Can't pickle <class 'class.method.var'>: it's not the same object as class.method.var
AttributeError: Can't pickle local object 'class.<locals>.some_var'
ํนํ ํ์ด์ฌ์ ์ฒ์ ์ ํ๋ ์ฌ์ฉ์๋, ํํ ์ ํ(?)ํ๋ "pickle์ ์ด์ฉํ์ฌ ํ์ด์ฌ ๋ฐ์ดํฐ ์ ์ฅํ๊ธฐ" ๋ฐ์์ ๊ธ์ ํตํด ๋ฐ์ดํฐ ์ ์ฅ ๋ฐฉ๋ฒ์ ์๋ชป ๋ฐฐ์ด ๊ฐ๋ฐ์๋ค์ด ์คํดํ๊ธฐ ์ฌ์ด ๋ถ๋ถ์ธ๋ฐ์, ํ์ด์ฌ ๋ฌธ์์๋ ๋ช ์๋์๋ฏ์ด pickle์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋๊ตฌ๊ฐ ์๋๋ผ "๊ฐ์ฒด ์ง๋ ฌํ" ๋๊ตฌ์ ๋๋ค.

์ง๋ ฌํ(serialization)๋ ๊ฐ๋จํ ๋งํด์, ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํธ ์คํธ๋ฆผ์ผ๋ก ๋ณํํ๋ ์ ์ฐจ์ ๋๋ค. ์ด๋ ๋ฐ์ด๋๋ฆฌ ํ์ผ๋ก ์ ์ฅ์ ํ๋ ํํ๋ก ๋ณด์ด๋, ์คํดํ ๋ง ํ๊ธด ํฉ๋๋ค. ๋ค๋ง ์ฌ๊ธฐ์ ์ฃผ๋ชฉํด์ผ ํ ๋ถ๋ถ์, ์ง๋ ฌํ ๋์์ด "๋ฐ์ดํฐ"๊ฐ ์๋๋ผ "๊ฐ์ฒด ๊ตฌ์กฐ"๋ฅผ ์ง๋ ฌํํ๋ ๋ฐ์ด๋๋ฆฌ ํ๋กํ ์ฝ์ด๋ผ๋ ์ ์ ๋๋ค.
## Pickling์ ๋ฌธ์ ์
- ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ์ง๋ ฌํํ๋ฉด, ํด๋น ๊ฐ์ฒด์ ๋ํ ๊ตฌํ์ด ํ์ฌ scope์ ์กด์ฌํ์ง ์์ผ๋ฉด unpickling ํ ๋ ์ค๋ฅ๊ฐ ๋ฉ๋๋ค.
"CustomClass" ์ธ์คํด์ค๋ฅผ pickle ํ๋๋ฐ, "CustomClass"๊ฐ ๋ญ์ง ์ ์ ์๋ ์ํ์์ unpickle์ด ์ ๋๋ ๊ฒ ๋น์ฐํ๊ฒ ์ฃ .
๋ฌด์๋ณด๋ค ์์ ์์์์ ๋์น ๋น ๋ฅธ ๋ถ๋ค์ ์๊ฒ ์ง๋ง, unpickle์ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒ์ด ์๋๋ผ ์ฝ๋๋ฅผ "์คํ"ํ๋ ๊ณผ์ ์ด๊ธฐ ๋๋ฌธ์, ๊ฒ์ฆ๋ pickle ์ค๋ธ์ ํธ๊ฐ ์๋๋ผ๋ฉด unpickle ๋ง์ผ๋ก๋ ์ ์ฑ์ฝ๋๋ฅผ ์คํ์ํค๊ฒ ๋ ์ ๋ ์๊ธฐ ๋๋ฌธ์ ์์ ํ์ง ์์ ํ๋กํ ์ฝ์ ๋๋ค.
ํ์ด์ฌ ๋ฌธ์์๋ ๋ฌด์๋ฌด์ํ ๊ฒฝ๊ณ ๋ฌธ๊ตฌ๊ฐ ์์ต๋๋ค.

- ๋ฐ์ด๋๋ฆฌ๋ฅผ "์คํ"ํ๊ธฐ ๋๋ฌธ์, ๋น์ฐํ ์๋ก ๋ค๋ฅธ ๋ฒ์ ์ ํ์ด์ฌ ๋ฐ์ด๋๋ฆฌ์์ ์์ฑํ pickle ์ค๋ธ์ ํธ๋ ๊ณต์ ํ ์ ์์ต๋๋ค.
- ex. Python 3.7.9์์ pickle๋ ์ค๋ธ์ ํธ๋ Python 3.8.16์์ unpickle ํ ์ ์๋ ๊ฒ. - ๋ฐ์ด๋๋ฆฌ ํ๋กํ ์ฝ์ด๊ธฐ์ ๋น์ฐํ ์ ์ฅ๋ ์ค๋ธ์ ํธ๋ human-readable ํ์ง ์์ต๋๋ค.
### huggingface model hub
๋ถ๊ณผ ๋ช ๋ฌ ์ ๋ง ํด๋ huggingface model hub๋ pickle์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์, ์ ๋ขฐํ ์ ์๋ ๋ชจ๋ธ์ด ์๋๋ผ๋ฉด ํจ๋ถ๋ก from_pretrained()๋ฅผ ์คํํด์ ์ ๋์์ต๋๋ค. (์ ์ฑ์ฝ๋๋ฅผ ์ฌ์ด๋ ์ ์๋ค๋๊น์?)
- ๋ฌผ๋ก ์ด ์ฌ์ค์ด ์๋ ค์ง๊ณ ๋์ huggingface ์ธก์์๋ ๋ฌด์๋ฌด์?ํ ๊ฒฝ๊ณ ๋ฌธ๊ตฌ์ ํจ๊ป ๋ชจ๋ธ์ด ์ ๋ก๋๋ ๋ ์ด๋ ์ ๋ ๊ฒ์๋ฅผ ํด์ฃผ๊ธฐ ์์ํ์ต๋๋ค.
https://huggingface.co/docs/hub/security-pickle
Pickle Scanning
Pickle Scanning Pickle is a widely used serialization format in ML. Most notably, it is the default format for PyTorch model weights. There are dangerous arbitrary code execution attacks that can be perpetrated when you load a pickle file. We suggest loadi
huggingface.co
pickle load๊ฐ ์, ์ผ๋ง๋ ์ํํ์ง์, ์ฃผ์ ์ฌํญ๋ค์ ๋ํด ์์ธํ ์ค๋ช ํ๊ณ ์์ผ๋, ๊ด์ฌ ์์ผ์๋ฉด ์ฝ์ด๋ณด๋ฉด ์ข์ ๊ธ์ ๋๋ค.
# Pickle ์ค๋ฅ ์ ํ
์ฌ์ค ๋๊ฒ ์ด๋ฐ local object ์ค๋ฅ๋, pickle์ด local object(์ ์ญ scope์์ ์ ์๋ฅผ ์ฐพ์ ์ ์๋)๋ค์ด pickle ๋์์ด ๋ ๋์
๋๋ค.
(un-pickle์ด ์ค์ ๋ก๋ ํด๋น ์ค๋ธ์ ํธ๋ฅผ ์ฌ์์ฑํ๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์คํํ๋ ๊ณผ์ ์ธ๊ฑธ ์๊ฐํ๋ฉด ๋น์ฐํ ์ค๋ฅ์ฃ .)
๋ช ๊ฐ์ง ๋ํ์ ์ธ ์ค๋ฅ ์ ํ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ๋ค์ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค. (๋๊ฒ global๋ก ์ ์ธํด ์ฃผ๊ฑฐ๋ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ํด์๋ฉ๋๋ค.)
ex1. Attribute Error - can't pickle local objects
๊ฐ์ฅ ํํ ์ ํ์ผ๋ก, ํจ์ ๋ด๋ถ์ ๋ก์ปฌ scope์์ ์ ์๋ ์ค๋ธ์ ํธ๋ฅผ pickle.dump ํ ๋ ๋ฐ์ํ๋ ์ค๋ฅ์ ๋๋ค.
import pickle
def get_model_class(params):
if params == 1:
class ModelA(object):
def __init__(self, ...):
pass
return ModelA
else:
class ModelB(object):
def __init__(self, ...):
pass
return ModelB
model_class = get_model_class(option)
model = model_class()
with open("model.pkl", "wb") as f:
pickle.dump(model, f, pickle.HIGHEST_PROTOCOL)
์ผ๋ จ์ ์กฐ๊ฑด ํน์ ์คํ ์ต์ ๋ฑ์ ๋ฐ๋ผ์ ๋ชจ๋ธ ํด๋์ค๋ฅผ ์ ํํด์ ๋ชจ๋ธ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ๊ฐ๋จํ๊ณ , ์ข ์ข ๋ง์ฃผํ ๋ฒํ ์ฝ๋์ ๋๋ค.
Traceback (most recent call last):
File "/Users/naubull2/test.py", line 20, in <module>
pickle.dump(model, f, pickle.HIGHEST_PROTOCOL)
AttributeError: Can't pickle local object 'get_model_class.<locals>.ModelA'
์ฒ์์ ์ค๋ช
๋๋ ธ๋ฏ์ด, ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ์ฝ๋์
๋๋ค.
ModelA ํด๋์ค์ ์ ์๋ get_model_class ํจ์์ ๋ก์ปฌ scope์ ์กด์ฌํฉ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ ์ญ scope์์๋ ModelA ํด๋์ค๊ฐ ์ ์๋ ์ฝ๋๊ฐ ์กด์ฌํ์ง ์๊ธฐ์ ํด๋น ์ธ์คํด์ค๋ฅผ ๋ง์ฝ pickle ๋๋ ๊ฑธ ํ์ฉํ๋ค๋ฉด, un-pickle ํ ์ ์์ ๊ฒ์ ์๋ฉด์ ์ค๋ธ์ ํธ๋ฅผ ์ ์ฅํ๊ฒ ๋๋ ๊ฒ์ด์ฃ .
๋ค์ ํ๋ฒ ์ด์ผ๊ธฐํ๋ฉด.. pickle์ ์ธ์คํด์ค๋ฅผ ๋ฐ์ด๋๋ฆฌ๋ก ์ ์ฅํ๋ ๊ฒ ์๋๋ผ ์ธ์คํด์ค๋ฅผ "์์ฑ"ํ๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ ์ฅํฉ๋๋ค.
๊ทธ๋ผ ์ด๋ฐ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ํด๊ฒฐํด์ผ ์ข์๊น์?
1. ๊ฐ๋จํ๊ฒ global๋ก ์ ์ญ ๋ณ์๋ก
๊ฐ์ฅ ๊ฐํธํ๊ฒ๋ global ์ ์ธ์ ๋ถ์ฌ์ pickle ํ๋ scope์์ ๋ชจ๋ธ ์ธ์คํด์ค ์์ฑ์์ ์ ์๋ฅผ ์ ์ ์๋๋ก ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
import pickle
def get_model_class(params):
global ModelA
global ModelB
if params == 1:
class ModelA(object):
def __init__(self, ...):
pass
return ModelA
else:
class ModelB(object):
def __init__(self, ...):
pass
return ModelB
model_class = get_model_class(option)
model = model_class()
with open("model.pkl", "wb") as f:
pickle.dump(model, f, pickle.HIGHEST_PROTOCOL)
2. ํด๋์ค ์ ์ ์ฝ๋๋ฅผ ์ ์ญ์ผ๋ก
ํ์ง๋ง, ์ฌ์ฌ์ฉ์ฑ์ด ๋์๋งํ ํด๋์ค๋ก ๋ณด์ด๋ ModelA, ModelB๋ฅผ ํจ์ ๋ด์์ ์ ์ํด ๋๊ณ global๋ก ๋ง๋๋ ๊ฒ์ ์ ๋ง ๊ตฌ์กฐ๊ฐ ์ด์ํฉ๋๋ค. ์ฐจ๋ผ๋ฆฌ ํด๋์ค ์ ์๋ค์ ํจ์ ๋ฐ์ผ๋ก ๋นผ๋ด๋ ํด๊ฒฐ๋๊ฒ ์ฃ ?
๊ธฐ๋ฅ์ ์ผ๋ก๋, get_model_class ํจ์๋ ์ต์ ์ ๋ฐ๋ผ ์์ฑํ ๋ชจ๋ธ์ ํด๋์ค๋ฅผ ๊ณ ๋ฅด๊ธฐ๋ง ํ๋ฉด ๋ ๋ฟ ๋น๋ ํจ์๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ํด๋์ค ์ ์๋ get_model_class ๋ฐ์ ์กด์ฌํ๋ ๊ฒ ๊ตฌ์กฐ์ ์ผ๋ก๋ ๊ธฐ๋ฅ์ ์ผ๋ก๋ ๋ช ํํฉ๋๋ค.
import pickle
class ModelA(object):
def __init__(self, ...):
pass
class ModelB(object):
def __init__(self, ...):
pass
def get_model_class(params):
if params == 1:
return ModelA
else:
return ModelB
model_class = get_model_class(option)
model = model_class()
with open("model.pkl", "wb") as f:
pickle.dump(model, f, pickle.HIGHEST_PROTOCOL)
3. ํด๋์ค ์ ์ ์ฝ๋๋ฅผ ๋ถ๋ฆฌ
๊ทธ๋ผ ๋ค ๋ ๊ฑธ๊น์? ์ด์ pickle๋ก ์ ์ฅ๋ ๋ชจ๋ธ์ ๋ค์ ๋ถ๋ฌ์ฌ ๋๋ฅผ ์๊ฐํด ๋ณด๋ฉด, ๊ฒฐ๊ตญ pickle.load ์์ ์ ํด๋น ์ฝ๋ scope์ ์ ์ฅ๋ ModelA๋ฅผ ์์ฑํ๊ธฐ ์ํด ํด๋น ํด๋์ค์ ์์ฑ์๊ฐ ์ด๋ป๊ฒ ์๊ฒผ๋์ง๋ฅผ ์์์ผ ํฉ๋๋ค.
๋ง์ฝ ์์์ ๋ค๋ฅธ ๋ชจ๋์์ ์์์ ์ ์ฅํ model.pkl์ ๋ก๋ํ๋ ค๊ณ ํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๋ฅผ ๋ณด๊ฒ ๋ฉ๋๋ค.
Traceback (most recent call last):
File "/Users/naubull2/main.py", line 3, in <module>
d = pickle.load(open("model.pkl", "rb"))
AttributeError: Can't get attribute 'ModelA' on <module '__main__' from '/Users/naubull2/main.py'>
ModelA์ ๋ํ ์ ์๋ฅผ ๋ชจ๋ฅด๋ ๊ณณ์์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์คํํ์ผ๋๊น ๋น์ฐํ ์ค๋ฅ๊ฐ ๋๊ฒ ์ฃ .
์ ์ฅํ๋ ๊ณณ์์๋, ๋ถ๋ฌ์ค๋ ๊ณณ์์๋ ํ์ํ ํด๋์ค ์ ์ ์ฝ๋๋, ์์ ์ฒ์๋ถํฐ ํด๋์ค ์ ์๋ฅผ ๋ณ๋ ๋ชจ๋๋ก ๋ถ๋ฆฌ ์์ผ๋๋ฉด, ํ์ํ ๊ณณ์์ ํด๋น ๋ชจ๋๋ง import ํด์ pickle dump / load ํ๋ ๊ฒ์ด ๊ตฌ์กฐ์ ์ผ๋ก ๊ฐ์ฅ ์์ ํ๊ณ ํด๋ฆฐ ํ ์ฝ๋๊ฐ ๋๊ฒ ์ฃ ?
# models.py
class ModelA(object):
def __init__(self, ...):
pass
class ModelB(object):
def __init__(self, ...):
pass
##########################################################
# save_model.py
import pickle
from models import ModelA, ModelB
def get_model_class(params):
if params == 1:
return ModelA
else:
return ModelB
model_class = get_model_class(option)
model = model_class()
with open("model.pkl", "wb") as f:
pickle.dump(model, f, pickle.HIGHEST_PROTOCOL)
##########################################################
# main.py
import pickle
from models import ModelA, ModelB
model = pickle.load(open("model.pkl", "rb"))
...
๋๋จธ์ง ์ ํ๋ค๋ ์์ธ์ ๋ชจ๋ ๋์ผํ๋ฐ, ์ํฉ์ด ๋ค๋ฅธ ๊ฒ๋ฟ์ ๋๋ค.
ex2. ๋ฉํฐํ๋ก์ธ์ฑ ํ๊ฒฝ์์์ can't pickle local objects
์ด์ , pickle์ด ์ ๋๋ ๊ฒฝ์ฐ์ ์ฃผ์ ์์ธ์ ์์๋๋ฐ, ๊ทธ๋ผ ์ ํ์ ์ผ๋ก ํด๋์ค๋ฅผ ๊ณ ๋ฅด๊ณ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ ์ธ์ ์ด๋ค ๊ฒฝ์ฐ์ ์ฃผ๋ก ๋ฐ์ํ ๊น์?
multiprocessing์ ์ด์ฉํ ๋, targetํจ์๋ฅผ ๋ก์ปฌ ํจ์๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ์๋ ๋ฐ์ ๊ฐ๋ฅํฉ๋๋ค.
๊ท๋ชจ๊ฐ ์ ๋ฒ ์๋ ์คํ์์ค ํ๋ก์ ํธ์์๋ ์ข
์ข
๋ณด์ด๋ ์ค๋ฅ ์ ํ์ด๋.. pickle์ ์ ์ฒด๋ฅผ ์์๋ ํผํ๊ธฐ๊ฐ ์ฝ์ง ์์ ์ค๋ฅ์ธ ๊ฒ ๊ฐ๋ค์.
https://github.com/pyg-team/pytorch_geometric/issues/366
import multiprocessing
def main():
a="string"
def task1():
print(a)
job1 = multiprocessing.Process(target=task1, args=(a))
job1.start()
job1.join()
main()
multiprocessing ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด๋ถ์์๋ target ํจ์๋ฅผ ์ ๋ฌํ ๋ pickle์ ์ฌ์ฉํฉ๋๋ค.
๋ฐ๋ผ์ worker process์์๋ ์์ ์์ ์์ ๋ก์ปฌ ํจ์์ธ task1()์ ์ ์๊ฐ ์์ด pickle ์ค๋ฅ๋ฅผ ์ผ์ผํต๋๋ค.
Traceback (most recent call last):
File "/Users/naubull2/test.py", line 10, in <module>
main()
File "/Users/naubull2/test.py", line 8, in main
job1.start()
...
File "/Users/naubull2/opt/anaconda3/lib/python3.9/multiprocessing/popen_spawn_posix.py", line 47, in _launch
reduction.dump(process_obj, fp)
File "/Users/naubull2/opt/anaconda3/lib/python3.9/multiprocessing/reduction.py", line 60, in dump
ForkingPickler(file, protocol).dump(obj)
AttributeError: Can't pickle local object 'function.<locals>.task1'
์ด ์ญ์ 1, 2์ ํด๊ฒฐ์ฑ
์ฒ๋ผ, ์ ์ญ์ผ๋ก ์ฎ๊ธฐ๊ฑฐ๋, global๋ก ์ ์ธํด ์ฃผ๋ฉด ๋๊ฒ ์ฃ ?
3์ ํด๊ฒฐ์ฑ
์ฒ๋ผtask1() ํจ์๋ฅผ ๋ณ๋ ๋ชจ๋๋ก ๋ผ์ด๋ด๋ ๊ฒ๋ ๋ฐฉ๋ฒ์ผ ํ
๋ฐ, ์ด๊ฑด ๊ฒฝ์ฐ์ ๋ฐ๋ผ์ ๊ฒฐ์ ํ๋ฉด ๋ฉ๋๋ค. ๋ณดํต job์ ์คํํ๋ ๊ณณ์์ job์ ์ ์ํ ๋งํผ ๊ฐ๋จํ ๊ฒฝ์ฐ๋ ๋ง์ผ๋๊น ์ด๋ด ๋ ๊ตณ์ด task1() ํจ์ ํ๋๋ง ๋ชจ๋๋ก ๋ผ์ด๋ด๋ ๊ฒ์ ๋ถ์์ฐ์ค๋ฌ์ธ ํ
๋๊น์.
ex3. lambda ํจ์ ์ฌ์ฉ ์ can't pickle local objects
์ด์ฏค ๋๋ฉด lambda ํจ์๋ ์์ ํจ์์ด๋, ๋น์ฐํ pickle ๋์ง ์์ ๊ฒ์ ์ ์ ์๊ฒ ์ฃ ?
import pickle
var = pickle.dumps(lambda x, y: x+y)
๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๋ฅผ ์ ๋ฐํฉ๋๋ค.
Traceback (most recent call last):
File "/Users/naubull2/test.py", line 2, in <module>
var=pickle.dumps(lambda x, y: x+y)
_pickle.PicklingError: Can't pickle <function <lambda> at 0x104c82040>: attribute lookup <lambda> on __main__ failed
lambda ํจ์๋ฅผ pickle ํ ... ์ผ์ด ์๊ฒ ๋๋ง๋.. ์ด๋ฐ ๊ฒฝ์ฐ๋ ๊ฐ๋จํ helper ํจ์๋ฅผ ํ๋ ์ ์ ํ๊ณ ์ ์ฅํ๋ ํธ์ด ๊ทธ๋๋ง ํด๊ฒฐ์ฑ ์ด ๋๊ฒ ๊ตฐ์.
# ๊ฒฐ๋ก
๊ธฐ๋ณธ์ ์ผ๋ก pickle์ ๋๋ฌด ๋งน์ ํ์ง ์๋ ๊ฒ์ด ์ข์ง๋ง, pickle ์์ฒด๋ ๊ณ ์ฑ๋ฅ serializer์ด๊ธฐ ๋๋ฌธ์, ์ฌ์ฉ์ ํด์ผ ํ๋ค๋ฉด, ์ ์ฒด๋ฅผ ํ์คํ๊ฒ ์ดํดํ๊ณ ์ฌ์ฉํด์ผ๊ฒ ์ฃ .
๋ฌผ๋ก ๋ด๊ฐ ์ง์ ์ฌ์ฉํ์ง ์์๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด์์ pickle์ serialize ์๋จ์ผ๋ก ์ธ ์ ๋ ์๊ธฐ ๋๋ฌธ์, ์์ ์์๋ค์ฒ๋ผ ์ฃผ๋ก ๋ฐ์ํ๋ ์์ธ์ scope ๋ฌธ์ ์ด๋ ์ด๋ฒ ํฌ์คํ ์ ํตํด pickle ์ค๋ฅ๋ฅผ ํด๊ฒฐํ์ค ์ ์๊ธฐ ๋ฐ๋๋๋ค.