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

时间:2012-07-13 06:23:42

标签: python global-variables return-value scope

我创建的程序将用于解析xml文件并将解析数据放入数据库中。虽然我的代码现在运行正常,但我的教师在我的代码中有一条评论,BTW这是我的代码:

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函数中,他不希望我在其中使用全局变量。如何在不将其声明为全局变量的情况下在主体中使用这些变量?

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

从函数

返回它们

例如

return article_code, date_received, s100rsd, remark_text

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

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

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

答案 1 :(得分:0)

您通常做的是返回“数据对象”,即包含相关数据的对象:

class dto(object):
  def __init__(self, **kw):
    self.__dict__.update(kw)

def parse_xml(source_path, xml_file):
    data = dto(article_code = '1234',
               date_received = 'abc',
               s100rsd = '%s-%s-%s' % ('ab', 'cd', 'efgh'),
               remark_text = 'eh5jhe5')
    return data

data = parse_xml('../', 'abc.xml')

然后按照您的预期使用data.data_received

另请注意您的行

os.listdir(source_path)
...
if xml_file.endswith('.xml'):

非常适合用

替换
import glob
xml_list = glob.glob(os.path.join(source_path, '*.xml'))