2016-11-18 54 views
-1

是否可以动态生成函数?Python - 是否可以动态生成函数

我已经写了一个函数来解析这个example.xml文件,并返回segment_1元素的属性作为列表。 现在这个例子包含四个部分,但是这将改变为不同的资产,一个只能有1段,另一个可能有10+。

下面是示例XML它有四个部分:

<?xml version="1.0" encoding="utf-8"?> 
<manifest task_id="00000000112"> 
    <asset_metadata> 
    <material_id>LB000001</material_id> 
    <series_title>test asset 1</series_title> 
    <season_title>Number 1</season_title> 
    <season_number>1</season_number> 
    <episode_title>ET 1</episode_title> 
    <episode_number>1</episode_number> 
    <start_date>18-11-2016</start_date> 
    <end_date>30-11-2016</end_date> 
    <ratings>15</ratings> 
    <synopsis>This is a test asset</synopsis> 
    </asset_metadata> 
    <file_info> 
    <source_filename>LB000001</source_filename> 
    <number_of_segments>4</number_of_segments> 
    <segment_1 seg_1_in="00:00:00.000" seg_1_out="00:01:00.000" seg_1_dur="00:01:00.000"/> 
    <segment_2 seg_2_in="00:02:00.000" seg_2_out="00:03:00.000" seg_2_dur="00:01:00.000"/> 
    <segment_3 seg_3_in="00:04:00.000" seg_3_out="00:05:00.000" seg_3_dur="00:01:00.000"/> 
    <segment_4 seg_4_in="00:06:00.000" seg_4_out="00:07:00.000" seg_4_dur="00:01:00.000"/> 
    <conform_profile definition="hd" aspect_ratio="16f16">ffmpeg -progress LOG_FILE.txt -i S_PATH/F_NAME.mp4 SEG_CONFORM</conform_profile> 
    <transcode_profile profile_name="amazon" package_type="tar">ffmpeg -safe 0 -progress LOG_FILE.txt -f concat -i T_PATH/CONFORM_LIST TRC_PATH/F_NAME.mp4</transcode_profile> 
    <target_path>F:/profiles/amazon</target_path> 
    </file_info> 
</manifest> 

我已经写了70行,如果将处理资产多达4段的说法,我可以随时添加到代码有资产更加细分,但是这是不是很优雅,所以我上的功能基于工作该元素在XML上动态创建的群列表:

<number_of_segments>4</number_of_segments> 

理想的情况下,将产生的NOx量:

return seg_element(root, path) 

parse_xml()函数基于资产有多少段。

下面是功能:

import xml.etree.ElementTree as et 
file = 'example.xml' 

# Seg_element 
def seg_element(xml_root, element_path): 
    list_a = [] 
    for elem in xml_root.iterfind(element_path): 
     a = elem.attrib 
     for i in a: 
      list_a.append([i + ' = ' + a[i]]) 
     return list_a 

# Parse_xml 
def parse_xml(file_input, number_of_segments): 
    tree = et.parse(file_input) 
    root = tree.getroot() 
    path = 'file_info/segment_1' 

    return seg_element(root, path) 


for i in parse_xml(file, 1): 
    print(i) 

这里是输出:

['seg_1_dur = 00:01:00.000'] 
['seg_1_in = 00:00:00.000'] 
['seg_1_out = 00:01:00.000'] 

通过seg_element的每次迭代(创建的列表的名称)将是不同的。

之所以这样做是为了创建一个命令提交到FFmpeg中,这里是70行,如果创建命令http://pastebin.com/jgawC48Y

+0

我不明白这一点。从你的例子中删除多余的垃圾。并显示你提到的70行'if'链的一部分。 –

+0

我必须问为什么是想要的最终结果?看起来你对这个印刷品做得很好。请参阅编辑 –

+0

以了解详细信息。 – Lewis909

回答

4

没有必要生成功能的语句,你只是想通过做一个循环段的数量,并相应地调用seg_element功能:

def parse_xml(file_input, number_of_segments): 
    tree = et.parse(file_input) 
    root = tree.getroot() 
    segments_no = int(root.find('file_info/number_of_segments').text) 
    segments = [] 

    for i in range(segments_no): 
     path = 'file_info/segment_%d' % (i+1) 
     segments.append(seg_element(root, path)) 

    return segments 

(上面的代码没有进行测试,但我认为你会得到它)

+0

感谢您的帮助,当我测试它时,它的工作原理包含了所有正确的数据。 – Lewis909

相关问题