python - 在Python中的函数中声明全局变量

标签 python global-variables return-value scope

我创建的程序将用于解析 xml 文件并将其解析数据放入数据库中。虽然我的代码现在可以正常运行,但我的导师在我的代码中有一条注释,顺便说一句,这是我的代码:

import os
import time
import MySQLdb
import ConfigParser
import elementtree.ElementTree as ET


def update_database(article_code, date_received, s100rsd, remark_text, db):
    cur = db.cursor()
    try:
        cur_query = cur.execute("""INSERT INTO tblS100CurrentListing """
                                """(article_Code, dateReceived, s100RSD, remarks) VALUES (%s, %s, %s, %s) """
                                """ON DUPLICATE KEY UPDATE revisedRSD = %s, remarks = %s """,
                                (article_code, date_received, s100rsd, remark_text, s100rsd, remark_text))
        db.commit()
    except MySQLdb.Error, e:
        print "An error has been passed %s" %e
        db.rollback
    rows_affected = cur.rowcount
    if rows_affected > 0:
        print "Changes made in the database"
    else:
        print "Nothing is change in  the database"


def parse_xml(source_path, xml_file):
    # Alvin: !!! globals?
    global article_code
    global date_received
    global s100rsd
    global remark_text
    article_code = xml_file.split('.')[0]
    tree = ET.parse(xml_file)
    root = tree.getroot()
    order = root.find('order')
    order_time = order.find('time')
    year = order_time.attrib['yr']
    month = order_time.attrib['month']
    day = order_time.attrib['day']
    hour = order_time.attrib['hr']
    min = order_time.attrib['min']
    sec = order_time.attrib['sec']
    date_received = year +  month + day +  hour + min + sec
    due_date = order.find('due-date')
    due_date_time = due_date.find('time')
    yr = due_date_time.attrib['yr']
    month = due_date_time.attrib['month']
    day = due_date_time.attrib['day']
    s100rsd = "%s-%s-%s" %(yr, month, day)
    item_info = order.find('item-info')
    item_remarks = item_info.find('item-remarks')
    item_remark_list = item_remarks.findall('item-remark')
    item_remark_len = len(item_remark_list) - 1
    item_remark = item_remark_list[item_remark_len]
    remark = item_remark.find('remark')
    remark_text = remark.text


def main():
    config = ConfigParser.ConfigParser()
    config.readfp(open('part4b.ini'))
    server = config.get('main', 'Server')
    port = config.get('main', 'Port')
    port = int(port)
    schema = config.get('main', 'Schema') 
    table = config.get('main', 'Table')
    user = config.get('main', 'User')
    password = config.get('main', 'Password')
    source_path = config.get('main', 'filepath')

    db = MySQLdb.connect(server, user, password, schema, port)
    xml_list = os.listdir(source_path)
    for xml_file in xml_list:
        if xml_file.endswith('.xml'):
            parse_xml(source_path, xml_file)
            update_database(article_code, date_received, s100rsd, remark_text, db)

    db.close()

    print "This will close after 2 seconds . ."
    time.sleep(2)


if __name__ == '__main__':
    main()

在 parse_xml 函数中,他不希望我在其中使用全局变量。如何在 main 中使用这些变量而不将其声明为全局变量?

感谢您的帮助。

最佳答案

从函数中返回它们

例如

return article_code, date_received, s100rsd, remark_text

这实际上返回一个包含 4 个项目的元组

你可以像这样在另一端提取它们

article_code, date_received, s100rsd, remark_text = parse_xml(...)

关于python - 在Python中的函数中声明全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11465186/

相关文章:

python - API:为什么 Python 数组没有排序方法?

javascript - 是否可以从外部 JavaScript 内部更改全局变量?

javascript - 使用ajax设置和调用全局变量

c++ - 函数返回的局部变量是否在 C++20 中自动移动?

c - 为什么返回一个负的errno? (例如返回-EIO)

jquery - 从异步函数中向函数返回 true

Python - 查询元组列表

python - 更新多个文件中的全局字典

python - 在 Flask/SQLAlchemy/jinja 中使用外连接引用查询结果

c++ - 使用 boost::chrono 计算执行时间