Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python串行检查重构_Python - Fatal编程技术网

Python串行检查重构

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

这个代码可以优化吗? 也许可以把它写得更短一些,让它更像“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_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()项)