簡體   English   中英

字符串索引必須是整數,而不是字符串-從字典中檢索值

[英]String indices must be integers, not string - retrieving value from dictionary

我正在嘗試從字典中檢索值。 它在我的代碼的一部分中運行良好,但在下一部分中斷。

if user is not None:

    user["Username"] = "Temp-"+user["Username"]

    print "USER ID: " + str(user["ID"]) #Works fine
    #Rename user in source account
    patch_user(user, headers)

補丁用戶:

def patch_user( user, headers ):
    """Patch a User field based on their ID
    """
    patched_user = request('patch_user', user["AccountID"], user, headers)

然后在請求中:

def request( request, account_id, user, headers):
    """Send a User request to the server
    Send a request to the server
    """
    url = api_root + "/accounts/" + str(account_id)

    function_dictionary = {'get_user_from_id': (requests.get,                       #Function
                                               (url + "/users/" + str(user),),      #Tuple of Arguments
                                               {'headers': headers}),               #Dictionary of keyword args

                               'patch_user':(requests.patch,
                                             (url + "/users/" + str(user["ID"]),),
                                             {'headers': headers, 'data':json.dumps(user)})

    func, args, kwargs = function_dictionary[request]
    result = func(*args, **kwargs)

    #Throw exception if non-200 response
    result.raise_for_status()

    #Result from query
    print "Query " + request + " result: " + result.text

    return result

我收到以下錯誤:

TypeError: string indices must be integers, not str

(url + "/users/" + str(user["ID"]),),

任何幫助表示贊賞!

編輯完整跟蹤:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensio
ns\Microsoft\Python Tools for Visual Studio\2.0\visualstudio_py_util.py", line 7
6, in exec_file
    exec(code_obj, global_variables)
  File "C:\Front-End\pcli-front
.py", line 179, in <module>
    user_operations.move_user(arguments['<source>'],arguments['<destination>'],
arguments['<id>'], headers)
  File "C:\Front-End\user_opera
tions.py", line 27, in move_user
    user = get_user_from_id(source_account, user_id, headers)
  File "C:\Front-End\user_opera
tions.py", line 68, in get_user_from_id
    user = request('get_user_from_id', account_id, user_id, headers)
  File "C:\Front-End\user_opera
tions.py", line 131, in request
    (url + "/users/" + str(user["ID"]),),
TypeError: string indices must be integers, not str

patch_user ,變量user是一個字符串,不再是字典。

要查看發生了什么,您可以嘗試在代碼中的多個位置添加print repr(user) 或使用日志記錄模塊。

您的異常來自與您認為完全不同的代碼路徑。 patch_user與它無關。 堆棧跟蹤表明問題出在get_user_from_id

看起來request的第三個參數意味着從patch_userget_user_from_id調用時有所不同。 patch_user調用它時, user是一個字典。 get_user_from_id調用它時, user是代表用戶ID的字符串。 問題在於,無論發出哪種類型的請求,該request仍會嘗試構建完整的function_dictionary ,因此此行:

(url + "/users/" + str(user["ID"]),),

即使user是字符串,仍然可以運行。 要解決此問題,您可以使用else / if鏈而不是字典來避免在不應該運行的時候運行有問題的代碼,或者可以針對每種請求類型將request分為不同的方法。

除了亞倫·迪古拉(Aaron Digulla)的答案之外:

我建議學習使用Python調試器進行學習,這很有幫助,請參閱http://docs.python.org/2/library/pdb.html

我使用pdb的方式是在IPython shell中使用“%run”運行腳本,並在“%debug”崩潰的情況下啟動pdb,請參見http://ipython.org/ipython-doc/stable/interactive/tutorial .html#debugging

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM