【问题标题】:Python functions and lists, where do they need to be?Python 函数和列表,它们需要放在哪里?
【发布时间】:2017-02-28 04:44:15
【问题描述】:

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

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()

我的主要故障是什么?

【问题讨论】:

  • 你在任何时候都在打电话给get_email_address吗?另外,请确保您没有在缩进中混合制表符和空格;在您的最后一个代码块中,您的前两个 print 调用以空格缩进,但最后一个以制表符缩进。混合这样的字符会导致解释器以令人惊讶和令人困惑的方式解释您的代码。
  • 什么是groupname?它没有定义。最接近的是groupnames,它实际上是一个列表。但我想你想比较字符串?
  • @Kevin,我没有主要调用 get_email_address,所以这就解释了为什么没有附加数据。空格与制表符的事情是我在论坛上做的。它们都是我源文件中的选项卡。
  • 您对范围的假设是正确的。在所有函数之外定义的变量是全局变量。并且从函数内附加到全局列表,将修改全局函数。但是你必须在某个时候调用该函数。

标签: python list append indentation


【解决方案1】:

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

  1. 我无法运行groups = server_response.findall('.//t:group', namespaces=xmlns),所以我必须猜测它返回的结构
  2. 我打电话给get_email_address 的参数是我知道无法在if group.get('name') == groupname: 中找到匹配项,因此在检查之后您的默认append 仍然会触发。

这符合您的预期:

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 中找到匹配项)。

【讨论】:

    猜你喜欢
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    相关资源
    最近更新 更多