要创建一个具有默认值的int,您可以调用int()。要创建具有默认值的字符串,您可以调用str()。你会怎样称呼在Python 3中创建NoneType的对象?
这不是纯粹的理论,在创建和序列化对象时,您需要优雅的对象工厂来进行默认设置和自定义类型规范。
编辑:具体的使用示例就在这里。我序列化由多个不同类型字段组成的状态。系统正在不断发展,新的领域正在被添加到州(如果你愿意的话,它是与特定用户的聊天机器人和对话状态)。我保留了一个可序列化字段列表及其默认对象工厂 - 例如int,str等。由于它,当反序列化状态并且字段未记录在持久存储中时,它使用函数初始化为默认值。对于某些字段,可以方便地区分N / A(无)和某些(甚至是空字符串)。显然lambda _: None
会起作用,type(None)
也会起作用,但我发现尴尬和不一致的是NoneType
,int
之后不再有任何list
on(“明确比隐含更好”)。
答案 0 :(得分:0)
None
单身有很多语义含义:没有值,将被替换的值,缺失值,忽略 - 这个值。如果你想要显式,那么你可以为空字段创建一个单独的类。
class EmptyField:
def __init__(self, *args, **kwargs):
pass
def __repr__(self):
return 'EmptyField()'
EmptyField
中的确切内容应由序列化程序确定。
答案 1 :(得分:0)
对于基本类型,例如int
,NoneType
,dict
以及其他简单的案例,那里有一个自然的"工厂"在Python中 - 它是ast.literal_eval
。
>>> import ast
>>> ast.literal_eval('None') is None
True
>>> ast.literal_eval('{1: 2}')
{1: 2}
>>> ast.literal_eval('1e6')
1000000.0
因此,如果您的数据是基本类型的叠加(例如json类似的东西),那么您可以使用单个ast.literal_eval
调用来解析它。与exec
和eval
不同,ast.literal_eval
更加安全,因为您无法使用它运行任何代码。