Python - 是否可以动态生成函数
Python - is it possible to dynamically spawn functions
是否可以动态生成函数?
我编写了一个函数来解析此 example.xml 文件和 returns 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 行的 if 语句,它将处理最多 4 个段的资产,我总是可以为具有更多段的资产添加到该代码中,但这不是很优雅,所以我正在处理一个函数根据 XML:
中的此元素动态创建细分列表
<number_of_segments>4</number_of_segments>
理想情况下,它会产生 x 数量的:
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 行 if 语句 http://pastebin.com/jgawC48Y
不需要生成函数,你只是想对段数做一个循环,并相应地调用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
(上面的代码未经测试,但我想你会明白的)
是否可以动态生成函数?
我编写了一个函数来解析此 example.xml 文件和 returns 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 行的 if 语句,它将处理最多 4 个段的资产,我总是可以为具有更多段的资产添加到该代码中,但这不是很优雅,所以我正在处理一个函数根据 XML:
中的此元素动态创建细分列表<number_of_segments>4</number_of_segments>
理想情况下,它会产生 x 数量的:
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 行 if 语句 http://pastebin.com/jgawC48Y
不需要生成函数,你只是想对段数做一个循环,并相应地调用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
(上面的代码未经测试,但我想你会明白的)