@attr.s
class SimpleDataClass:
number = attr.ib(type = int)
string = attr.ib(type = str)
float_ = attr.ib(type = float)
decimal_ = attr. ib()
object_ = attr.ib()
@attr.s
class Data:
obj = attr.ib()
data = SimpleDataClass(2018, 'PyConSK', 3.1459, decimal.Decimal('1.414'), Data(42))
data
SimpleDataClass(number=2018, string='PyConSK', float_=3.1459, decimal_=Decimal('1.414'), object_=Data(obj=42))
pickled_object = pickle.dumps(data)
deserialized = pickle.loads(pickled_object)
deserialized
SimpleDataClass(number=2018, string='PyConSK', float_=3.1459, decimal_=Decimal('1.414'), object_=Data(obj=42))
data == deserialized
True
class HackyHacky:
def __init__(self) -> None:
self._unused_value = 42
def __setstate__(self, state: Dict[str, Any]) -> None:
print('Execute order 66')
for k,v in state.items():
attribute = getattr
setattr(self, k, v)
remote_code = pickle.dumps(HackyHacky())
x = pickle.loads(remote_code)
Execute order 66
@attr.s
class User:
name = attr.ib()
user = User('Gejza')
user
User(name='Gejza')
stored_user = pickle.dumps(user)
restored_user = pickle.loads(stored_user)
restored_user
User(name='Gejza')
@attr.s
class User:
name = attr.ib()
password = attr.ib()
user = pickle.loads(stored_user)
user
User(name='Gejza', password=NOTHING)
user.password
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-17-9456b1ab438a> in <module>() ----> 1 user.password AttributeError: 'User' object has no attribute 'password'
new_user = User('Harry', 'nbuSR123')
new_user
User(name='Harry', password='nbuSR123')
new_user.password
'nbuSR123'
pip install ql-charon
@attr.s
class User:
name: str = attr.ib()
registry = charon.CodecRegistry()
@registry.dumper(User, version = 1)
def dump_user_v1(obj: User) -> str:
return obj.name
@registry.loader(User, version = 1)
def load_user_v1(data: str) -> User:
return User(data)
codec = charon.Codec([registry])
user = User('Gejza')
user
User(name='Gejza')
encoded_user = codec.dump(user)
encoded_user
{'!meta': {'dtype': 'User', 'version': 1}, 'params': 'Gejza'}
restored_object = codec.load(encoded_user)
restored_object == user
True
restored_object
User(name='Gejza')
user
User(name='Gejza')
@attr.s
class User:
name: str = attr.ib()
password: str = attr.ib() # <~
registry = charon.CodecRegistry()
@registry.dumper(User, version = 2)
def dump_user_v2(obj: User) -> Dict[str, Any]:
return {
'name': obj.name,
'password': obj.password
}
@registry.loader(User, version = 1)
def load_user_v1_migration(data: str) -> User:
return User(name = data, password = None)
@registry.loader(User, version = 2)
def load_user_v2(data: Dict[str, Any]) -> User:
return User(**data)
codec = charon.Codec([registry])
restored_user = codec.load(encoded_user)
restored_user
User(name='Gejza', password=None)
user == restored_user
False
cprofile
__new__
cython
cython
Rovnaké datové typy v jadre
decimal.Decimal
datetime.{datetime, date, time, timedelta}
set
frozenset