繁体   English   中英

清单不是清单时的Python吗? 列表对象没有属性拆分

[英]Python when a list isn't a list? list object has no attribute split

我有一个发送到我的API的用户ID列表:

Users = ['x1','x2']

在我的序列化器create方法中,我尝试遍历它们:

    users = validated_data.get('users', None)
    for user in users:
        print(user)
        print("===")

我收到的输出是:

> x1,x2
> ===

它而不是遍历列表,而是输出为一行! 这对我来说不是一个列表,而是一个字符串,所以我检查了提供空白的type(users) ,即没有类型。

因此,我尝试将用户拆分为users.split()然后出现矛盾“ 列表对象没有属性拆分 ”!

这里出什么问题了,感到困惑吗?

看来用户是一个看起来像这样的列表: ['x1,x2'] 而不是您期望的: ['x1','x2']

您可以使用ast.literal_eval首先创建列表,也可以仅拆分一个元素:

users = ['x1,x2']
for user in users[0].split(','):
    print(user)
    print('===')

输出:

>>> users = ['x1,x2']
>>> for user in users[0].split(','):
...    print(user)
...    print('===')


x1
===
x2
===

根据您的评论:

from ast import literal_eval
users = ['[1,2]']

users = literal_eval(users[0])
for user in users:
    print(user)
    print('===')

输出:

1
===
2
===

对于users = ['[x1,x1]']

users = ['[x1,x1]']
users = users[0][1:-1]

for user in users.split(','):
    print(user)
    print('===')

看起来users是一个包含单个项x1,x2列表

>>> users = ['x1,x2']
>>> for user in users:
...     print(user)
...     print("===")
... 
x1,x2
===

其他人指出,您似乎有一个包含单个字符串['x1, x2']

我看了看Django REST Framework的内部结构,它肯定会返回一个列表。

ListField继承自Field ,该字段定义了一些方法,包括run_validationto_internal_valueto_representation

这些方法中有两个是抽象的,其中之一是run_validation实际上通过调用self.to_internal_value(data)来调用验证。

因此,要查看验证程序的工作,我们必须查看ListField的to_internal_value实现。

to_internal_value内部的注释是这样的:

"""
    List of dicts of native values <- List of dicts of primitive datatypes.
"""

然后,它检查无效的输入类型,最后调用run_validation

根据我的IDE,Django REST Framework中有5种run_validation实现。 最相关的一个可能是ListSerializer

5个run_validation的实现

ListSerializer上方的ListSerializer告诉我们,我们可能在正确的位置:

# There's some replication of `ListField` here,
# but that's probably better than obfuscating the call hierarchy.

ListSerializer验证每个项目(源) ,然后将其追加到名为ret的列表中。 因此,我们应该返回一个列表。

难题中未解决的部分是您的输入是什么导致输出不正确,但是通过调用堆栈进行跟踪,代码似乎可以正常工作。

编辑:

是否因为to_representation认为这是一本字典而使您的列表扁平化?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM