字符串索引必须是整数,而不是字符串 - 从字典中检索值

时间:2014-01-16 10:14:56

标签: python 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

3 个答案:

答案 0 :(得分:2)

patch_user中,变量user是一个字符串,不再是字典。

要查看正在发生的情况,您可以尝试在代码中的多个位置添加print repr(user)。或者使用日志记录模块。

答案 1 :(得分:2)

您的异常来自与您认为完全不同的代码路径。 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划分为针对每种请求类型的单独方法。

答案 2 :(得分:1)

除了Aaron Digulla的回答:

我建议学习使用Pythons调试器,这有很多帮助,请参阅http://docs.python.org/2/library/pdb.html

我使用pdb的方式是从IPython shell运行带有“%run”的脚本,并在遇到“%debug”崩溃的情况下启动pdb,请参阅http://ipython.org/ipython-doc/stable/interactive/tutorial.html#debugging