Python函数和列表,它们需要在哪里?

时间:2017-02-27 19:26:04

标签: python list append indentation

相当新的Python,所以这可能是基本的,但非常感谢帮助。我使用Python来调用我的Tableau服务器API,并尝试遍历组中的每个用户并构建电子邮件地址列表,目的是通过电子邮件向每个组发送他们的视图的pdf。我已经在所有功能之外定义了我需要的列表(我认为这是全局的)。在下面的代码示例中,我附加了' testuser'因为我不希望前面的循环最初工作。我只是想确定数据是否会附加到全局定义的列表中。它不是。当我在主函数中打印列表时,它是空的。

xmlns = {'t': 'http://tableau.com/api'}    
groupnames = ['Data Source Publisher']
workbooks = []
usernames = []

def get_email_address(groupname):
    groups = server_response.findall('.//t:group', namespaces=xmlns)
    for group in groups:
        if group.get('name') == groupname:
            usernames.append(group.get('id'))

    usernames.append('2002327')
    return usernames;

def main():
    print(usernames)

if __name__ == '__main__':
    main()

我的主要故障是什么?

1 个答案:

答案 0 :(得分:1)

问题不在于您没有更新全局变量。问题是您不能在代码中的任何位置调用get_email_address

  1. 我无法运行groups = server_response.findall('.//t:group', namespaces=xmlns)所以我必须猜测它返回的结构
  2. 我打电话给get_email_address,我知道在if group.get('name') == groupname:中无法获得匹配的参数,以便在该检查之后您的默认append仍会触发。
  3. 这符合您的期望:

    xmlns = {'t': 'http://tableau.com/api'}    
    groupnames = ['Data Source Publisher']
    workbooks = []
    usernames = []
    
    def get_email_address(groupname):
        groups = [{'name': 'abc', 'id': '789'}, {'name': '123', 'id': '678'}] # I assume this is representative
        for group in groups:
            if group.get('name') == groupname:
                usernames.append(group.get('id'))
    
        usernames.append('2002327')
        return usernames
    
    def main():
        get_email_address('something') # Call the function
        print(usernames)
    
    if __name__ == '__main__':
        main()
    

    如果您将get_email_address('something')更改为get_email_address('abc'),则会注意到您的打印全局列表包含两个项目(因为它会在groups中找到匹配项。)