簡體   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