我正在创建一个小型python应用程序,它将文件名称格式化为一组规则。我在找到将一般格式化函数列表应用于相同字符串的方法时遇到问题。我想应用一个函数,然后是另一个函数,然后是另一个函数。
我设法找到一种有效的方法,但我觉得它非常笨拙。
这里我有一个列表,其中包括一个函数和一个kwargs字典。 (所有这些函数都有一个未包含在字典中的“text”参数。)
functions = [
[SRF.change, {'old': '.', 'new': ' '}],
[SRF.surround, {'value': SU.get_year}],
[SRF.remove, {'chars': '[],'}],
[SRF.capitalize_words, {}],
[SRF.remove_including, {'value': 'mp4'}]]
然后我将其传递给custom_rename
函数。它遍历函数列表并将其应用于“text”变量。如您所见,每次调用func(text, **kwargs)
时变量都会更改。
def custom_rename(text, functions_list):
# Apply a list of functions to a string
for func_list in functions_list:
func = func_list[0] # Function
kwargs = func_list[1] # Dictionary
try:
text = func(text, **kwargs)
except AttributeError:
pass
return text
有更优雅的方式吗?例如,我不喜欢我必须知道函数位于[0]并且字典在[1]中。
答案 0 :(得分:2)
您可以使用functools.partial
创建已填充参数的callables,而不是存储[function, arguments]
列表:
from functools import partial
functions = [
partial(SRF.change, old='.', new=' '),
partial(SRF.surround, value=SU.get_year),
partial(SRF.remove, chars='[],'),
SRF.capitalize_words,
partial(SRF.remove_including, value='mp4')
]
现在您的custom_rename
功能可以简化为:
def custom_rename(text, functions_list):
# Apply a list of functions to a string
for func in functions_list:
try:
text = func(text)
except AttributeError:
pass
return text