Python串行检查重构
这个代码可以优化吗? 也许可以把它写得更短一些,让它更像“pythonic”Python串行检查重构,python,Python,这个代码可以优化吗? 也许可以把它写得更短一些,让它更像“pythonic” ... check_pass = 0 if key == 'media': size_check_pass = 0 if some_check_func(xxx): size_check_pass = 1 ... format_checks_pass = 0 if...some_checks... : format_checks_pass = 1 if size_c
...
check_pass = 0
if key == 'media':
size_check_pass = 0
if some_check_func(xxx): size_check_pass = 1
...
format_checks_pass = 0
if...some_checks... : format_checks_pass = 1
if size_check_pass and format_checks_pass: check_pass = 1
if key == 'text':
line_end_check_pass = 0
if (((some checks))): line_end_check_pass = 1
lenght_check_pass = 0
if len(file) < 1000: lenght_check_pass = 1
if line_end_check and lenght_check_pass: check_pass = 1
if check_pass:
...
。。。
检查\u pass=0
如果键==“媒体”:
大小\检查\通过=0
如果某些检查功能(xxx):大小检查通过=1
...
格式检查通过=0
如果…一些支票…:格式检查通过=1
如果大小检查通过和格式检查通过:检查通过=1
如果键=='text':
行\结束\检查\通过=0
如果((某些检查)):行\结束\检查\通过=1
长度检查通过=0
如果长度(文件)<1000:长度检查通过=1
如果行结束检查和长度检查通过:检查通过=1
如果检查通过:
...
代码的背景是检查每种文件类型的不同情况。您可以使用字典作为一种分派表。差不多
def media_checks(f):
...
return pass
def text_checks(f):
...
return pass
_dispatch = {}
_dispatch['media'] = media_checks
_dispatch['text'] = text_checks
dispatch_func = _dispatch[key]
check_pass = dispatch_func(your_file)
这会将您的代码拆分,以便更易于阅读和维护。它还隔离了用于检查单个函数中每个文件类型的代码。首先,对于第一个
if
,您的代码存在条件复杂性代码气味。您可以使用内联方法
重构进行修复:您不需要大小检查通过
和格式检查通过
布尔值,并且可以在最终的if语句中直接计算这两个条件,使用if…一些检查。。。如果大小检查通过和格式检查通过,则有些检查功能(xxx)
而不是。这给了你
check_pass = 0
if key == 'media':
if ...some_checks... and some_check_func(xxx):
check_pass = 1
然后,对第二个也执行此操作。如果您已经有了key='media'
,那么您不想检查key='text'
,所以最后
check_pass = 0
if key == 'media':
if some_check_func(xxx)and ...some_checks...:
check_pass = 1
else if key == 'text':
if (((some checks)))and len(file) < 1000:
check_pass = 1
if check_pass:
...
check\u pass=0
如果键==“媒体”:
如果某些检查功能(xxx)和…某些检查…:
检查通过=1
否则,如果键=='text':
如果((某些检查))和len(文件)<1000:
检查通过=1
如果检查通过:
...
所以您总是有一系列检查
首先,您可以缩短您的条件:
...
check_pass = False # to make it more boolean
if key == 'media':
size_check_pass = some_check_func(xxx)
format_checks_pass = ...result of your checks...
check_pass = size_check_pass and format_checks_pass
if key == 'text':
line_end_check_pass = (((some checks)))
length_check_pass = len(file) < 1000
check_pass = line_end_check and length_check_pass
if check_pass:
...
。。。
选中_pass=False#使其更布尔
如果键==“媒体”:
尺寸检查通过=一些检查功能(xxx)
格式检查通过=…检查结果。。。
检查通过=大小检查通过和格式检查通过
如果键=='text':
行结束检查通过=((一些检查)))
长度检查通过=长度(文件)<1000
检查通过=线检查结束检查和长度检查通过
如果检查通过:
...
或者进一步压缩它们:
...
check_pass = False # to make it more boolean
if key == 'media':
check_pass = some_check_func(xxx) and ...result of your checks...
if key == 'text':
check_pass = (((some checks))) and len(file) < 1000
if check_pass:
...
。。。
选中_pass=False#使其更布尔
如果键==“媒体”:
检查通过=一些检查功能(xxx)和…您的检查结果。。。
如果键=='text':
check_pass=((一些检查))和len(文件)<1000
如果检查通过:
...
然后你可以应用一个类似于jamesj的系统,但是可能有条件表达式列表:
def some_checks():
...
return True or False
def other_checks(f):
...
return ...
_dispatch = {
'media': [lambda: some_check_func(xxx), some_checks],
'text' : [other_checks, lambda: len(file) < 1000]
}
dispatch_list = _dispatch[key]
check_pass = all(func() for func in dispatch_list)
def一些_检查():
...
返回真或假
def其他_检查(f):
...
返回。。。
_调度={
“媒体”:[lambda:some_check_func(xxx),some_check],
“文本”:[其他检查,lambda:len(文件)<1000]
}
调度列表=\u调度[键]
选中\u pass=all(调度列表中func的func()项)