![](/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.