2016-11-18 37 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

相關問題