布尔变量驱动代码的Python代码可读性

布尔变量驱动代码的Python代码可读性,python,Python,我有一个config.py文件,它是一堆bool参数,比如 show_timer = True display_graph = True 我的主代码运行在一个while循环中,如果上述参数为False,则循环中的代码似乎非常混乱,无法执行。这种配置文件驱动代码的可读性最好的方法是什么?我目前使用的格式如下: init_someting() if display_graph else None while True: do_something() if show_

我有一个config.py文件,它是一堆bool参数,比如

show_timer = True
display_graph = True
我的主代码运行在一个while循环中,如果上述参数为False,则循环中的代码似乎非常混乱,无法执行。这种配置文件驱动代码的可读性最好的方法是什么?我目前使用的格式如下:

    init_someting() if display_graph else None
    while True:
        do_something() if show_timer else None
           .
           .
           .

如果保留其他对象不是约束条件,则可以使用配置到函数映射的
dict

func_dict = {'show_timer': timer_func,
        'display_graph': display_graph_func}
现在迭代func_dict以检查配置值。比如:-

for config_param, func_obj in func_dict.items():
    if config[config_param]:
        func_obj()
或简写:-

[func_obj() for config_param, func_obj in func_dict.items() if config[config_param]
但是,再次向函数传递参数将是一个问题。检查您是否能计算出它。

如中所述,不要使用条件表达式;使用正常的
if
语句。看起来你已经在函数中完成了所有的操作,所以我认为没有其他的事情要做了

if display_graph:
    init_something()

while True:
    if show_timer:
        do_something()

    if other_option:
        do_other_thing()
仅用于教育目的(但在某些地方,这种模式很有用)

根据您正在执行的操作的详细信息,您还可以使用配置选项来构建要调用的函数列表,然后在该列表上重复循环。大概是这样的:

if display_graph:
    init_something()

functions_to_call = []

if show_timer:
    functions_to_call.append(do_something)

if other_option:
    functions_to_call.append(do_other_thing)

while True:
    for function in functions_to_call:
        function()
或:


/仅用于教育目的

使用条件表达式不是这里的方法,不可以。如果显示图形:init\u something()只需使用
。作为一名C#/Java程序员,我的目标是通过多态性消除所有类似的条件,如果您不喜欢
If…:
的两行,您可以创建一个类似于
do#u If(condition,function#u to_execute,*parameters)
的帮助函数,但这只适用于单个函数。就我个人而言,我只会使用常规的
if
语句。虽然似乎
Simple比complex
更好。坚持常规的if语句似乎是目前最简单的选择,但我喜欢函数到调用列表的想法,这将在将来有所帮助。你能告诉我为什么要避免使用单行条件表达式吗?我有点喜欢它,因为它是一行。@ovunctuzel,它用于返回值,而不是有条件地调用函数;您应该使用正常的
if
语句来进行此操作。一行程序可能很酷,但这并不意味着你应该尽可能地在任何地方使用它们。线路很便宜:)。
if display_graph:
    init_something()

all_functions = [
    (show_timer, do_something),
    (other_option, do_other_thing),
]

functions_to_call = [function for (flag, function) in all_functions if flag]

while True:
    for function in functions_to_call:
        function()