优雅的无物体工厂

时间:2016-10-27 08:37:04

标签: python python-3.x nonetype

要创建一个具有默认值的int,您可以调用int()。要创建具有默认值的字符串,您可以调用str()。你会怎样称呼在Python 3中创建NoneType的对象?

这不是纯粹的理论,在创建和序列化对象时,您需要优雅的对象工厂来进行默认设置和自定义类型规范。

编辑:具体的使用示例就在这里。我序列化由多个不同类型字段组成的状态。系统正在不断发展,新的领域正在被添加到州(如果你愿意的话,它是与特定用户的聊天机器人和对话状态)。我保留了一个可序列化字段列表及其默认对象工厂 - 例如int,str等。由于它,当反序列化状态并且字段未记录在持久存储中时,它使用函数初始化为默认值。对于某些字段,可以方便地区分N / A(无)和某些(甚至是空字符串)。显然lambda _: None会起作用,type(None)也会起作用,但我发现尴尬和不一致的是NoneTypeint之后不再有任何list on(“明确比隐含更好”)。

2 个答案:

答案 0 :(得分:0)

None单身有很多语义含义:没有值,将被替换的值,缺失值,忽略 - 这个值。如果你想要显式,那么你可以为空字段创建一个单独的类。

class EmptyField:

    def __init__(self, *args, **kwargs):
        pass

    def __repr__(self):
        return 'EmptyField()'

EmptyField中的确切内容应由序列化程序确定。

答案 1 :(得分:0)

对于基本类型,例如intNoneTypedict以及其他简单的案例,那里有一个自然的"工厂"在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调用来解析它。与execeval不同,ast.literal_eval更加安全,因为您无法使用它运行任何代码。