重复引用命令行选项的配置时保持代码干燥
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
等放在其他代码之前,这让代码很难阅读。我还考虑过使用具有相同基本功能的多种方法,但如果用户输入 silent
或 semisilent
,则代码会被遗漏,但这会导致不必要的代码重复。
是否有另一种/好的方法来改变我的方法的行为,而不必使其不可读或多次重写代码?
非常感谢您的帮助!
-杰伦
定义您自己的自定义 "print" 方法,该方法检查是否设置了某些变量(静默),如果设置了该值,则跳过打印它。所以你所有的行 print('value') 都会变成类似 myprint('value') 的东西。我个人喜欢使用函数名称 verbose() 和 debug() 并具有两个日志级别。在您的情况下,可以将它们称为 "silent()" 和 "semisilent()" 或其他名称。
我刚得到一个 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
等放在其他代码之前,这让代码很难阅读。我还考虑过使用具有相同基本功能的多种方法,但如果用户输入 silent
或 semisilent
,则代码会被遗漏,但这会导致不必要的代码重复。
是否有另一种/好的方法来改变我的方法的行为,而不必使其不可读或多次重写代码?
非常感谢您的帮助! -杰伦
定义您自己的自定义 "print" 方法,该方法检查是否设置了某些变量(静默),如果设置了该值,则跳过打印它。所以你所有的行 print('value') 都会变成类似 myprint('value') 的东西。我个人喜欢使用函数名称 verbose() 和 debug() 并具有两个日志级别。在您的情况下,可以将它们称为 "silent()" 和 "semisilent()" 或其他名称。