【问题标题】:Python Schematics - Dict type with multiple value typesPython Schematics - 具有多种值类型的字典类型
【发布时间】:2019-03-10 05:51:09
【问题描述】:

免责声明:我是 Python 的超级菜鸟,所以请耐心等待。

我什至不确定这是否可能,但我们在 Python 中使用 Schematics 进行数据验证,并且我们有一个可以具有多种类型值的字典列表(例如字符串列表、数字列表、字典列表等)所以我的第一次尝试是使用联合类型。

现在,模型如下所示:

class Filter(Model):
    _id = ObjectIdType(default=ObjectId)
    name = StringType()
    filters = ListType(DictType(UnionType([ListType(StringType()),
              ListType(NumberType()),BooleanType(), StringType()])))
    created_at = DateTimeType(default=datetime.datetime.now)
    updated_at = DateTimeType(default=datetime.datetime.now)

但是由于某种未知的原因,isinstance() 给了我一个错误,即 arg 2 必须是一个类型或类型的元组(我感觉这意味着只能统一 2 种类型)。所以我有点没有想法。我尝试编写自定义模型并使用 ModelType,但这也没有飞得太远。

提前谢谢你!

【问题讨论】:

标签: python python-3.x schema


【解决方案1】:

您说您有一本包含多种键类型的字典。在 python 中,只要它们是可散列的,键的类型无关紧要。意味着以下内容是完全可以接受的:

my_dict={}    
my_dict[1]=[1,2,3]    
my_dict['s']='hello'    
my_dict[(0,2)]={'a':1,2:'b'}
print(my_dict)
{1: [1, 2, 3], 
's': 'hello', 
(0, 2): {'a': 1, 2: 'b'}
}

但是,您声明您的键是其他值的列表。因为列表是可变的,所以它不能用作字典中的键:

my_dict[[1,2]]='coords'
TypeError: unhashable type: 'list'

解决方案是将列表键转换为元组键,如我上面的第三个示例所示,它们的结构相似但不可变

【讨论】:

  • 我的错,我超级累。我想指的是多种类型的“值”,而不是键。
  • 这更有意义。但是,主要观点仍然存在。 Python 不关心字典中值的类型。你有什么理由必须联合这些类型吗?
  • 老实说,阅读您的 cmets 以及您上面链接的问题,我开始怀疑整个验证的实用价值。
  • 抱歉,如果这对您的情况不可行,但与其尝试合并所有类型然后通过单个过滤器,不如定义更好的代码实践/更具可读性/更易于维护单独验证每种输入类型,然后通过一些 if/elif 逻辑将其传递?不过,这可能会降低效率,具体取决于您必须处理多少数据。
  • 是的,最后我们得出了相同的结论:要么我们定义一个非常具体的自定义模型,其中包含每个字段的类型,要么我们留下一个非常通用的类型,可以添加任何子类型.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多