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



我创建的程序将用于解析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(...)

您通常会返回一个"数据对象",即包含相关数据的对象:

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

相关内容

  • 没有找到相关文章

最新更新