重复引用命令行选项的配置时保持代码干燥

Keeping code DRY when repeatedly referring to command-line options' configuration

我刚得到一个 Raspberry Pi,我正在为它构建一个基于 Reddit API 的应用程序,使用 PRAW 库。我正在使用以下命令执行我的 python 文件:

sudo python3 main.py

但是,我想从命令行向这个文件传递参数(这样我就可以 运行 应用程序静默地通过传递参数 silent 来实现),我知道我可以使用 sys.argv[0], sys.argv[1], etc...

我的问题是如何在遵循 DRY -- Don't Repeat Yourself -- 参考由这些选项建立的配置时执行此操作。

这是我的代码的一部分:

def init():
if (len(sys.argv) >= 1):
    global semisilent
    global silent
    for arg in sys.argv:
        if arg == "semisilent":
            semisilent = True
        if arg == "silent":
            silent = True

print ("--------[ Reddipi v0.1 ]--------\n")

if silent:
    print ("   ++Running in silent mode++   \n")
elif semisilent:
    print ("++Running in semi-silent mode++ \n")
else:
    print ("      Logging in to reddit      ")
    print ("              ....              ")
global r
r = oauth.login()

if not silent:
    print ("        Login successful        \n")

if not silent and not semisilent:
    print ("     Connecting to database     ")
    print ("              ....              ")
db.init(tablename)
if not silent:
    print ("     Connection successful      \n")

if not silent and not semisilent:
    global sub_name
    q_sub = input("      Use custom subreddit?     \n")
    if (q_sub[0]=="y"):
        q_sub = input("     Enter custom subreddit:    \n")
        if ((len(q_sub)==0) or (q_sub==" ")):
            print ("  No valid input. Using default \"" + sub_name + "\" \n")
        else:
            sub_name = q_sub
            print ("\r   Using subreddit \"" + sub_name + "\"\n")
    else:
        print ("        Using default \"" + sub_name + "\"    \n")

我发现自己不断将 if not silent 等放在其他代码之前,这让代码很难阅读。我还考虑过使用具有相同基本功能的多种方法,但如果用户输入 silentsemisilent,则代码会被遗漏,但这会导致不必要的代码重复。

是否有另一种/好的方法来改变我的方法的行为,而不必使其不可读或多次重写代码?

非常感谢您的帮助! -杰伦

定义您自己的自定义 "print" 方法,该方法检查是否设置了某些变量(静默),如果设置了该值,则跳过打印它。所以你所有的行 print('value') 都会变成类似 myprint('value') 的东西。我个人喜欢使用函数名称 verbose() 和 debug() 并具有两个日志级别。在您的情况下,可以将它们称为 "silent()" 和 "semisilent()" 或其他名称。