![](/img/trans.png)
[英]Python 2 : AttributeError: 'list' object has no attribute 'split'
[英]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_validation
, to_internal_value
和to_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
。
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.