我已經編寫了一個python模塊mymod.py,它也可以用作命令行中的獨立程序。Python 2.7:如何傳遞獨立/模塊代碼的選項
在mymod.py中,我定義了幾個函數(其中默認值是使用關鍵字設置的), 和if __name__=="__main__"
塊將模塊用作獨立程序。
我想覆蓋一些默認選項的可能性,因此在主程序I import argparse
中並使用它來分析選項。我使用字典來存儲 的默認值,這樣如果有一天我需要更改默認值,我可以很容易地將其修改爲只在一個地方的值 。
它的工作原理,但我發現代碼不是「乾淨」,並認爲可能我沒有以適當的pythonic方式做它。
這是一個玩具爲例,說明我做的:
#!/usr/bin/env python
#mymod.py
__default_options__={
"f1_x":10,
"f2_x":10
}
def f1(x=__default_options__["f1_x"]):
return x**2
def f2(x=__default_options__["f2_x"]):
return x**4
# this function is the "core" function which uses f1 and f2
# to produce the main task of the program
def f(x=__default_options__["f1_x"],y=__default_options__["f2_x"]):
return f1(x)+f2(y)
if __name__=="__main__":
import argparse
parser = argparse.ArgumentParser(description = "A toy application")
parser.add_argument("--f1-x",help="the parameter passed to f1",
default=__default_options__["f1_x"], type = float,dest = "x")
parser.add_argument("--f2-x",help="the parameter passed to f2",
default=__default_options__["f2_x"], type = float, dest = "y")
options= parser.parse_args()
print f(options.x,options.y)
像我這樣做是有點麻煩,可能針對的Python和argparse都精神傳遞的默認值。
這段代碼如何改進以使其變得更加pythonic,並且最好使用argparse?
我想,你不應該使用帶有兩個下劃線的變量,因爲它可能會在未來的Python版本中破壞代碼。 – 2013-03-22 12:08:46
此外,函數中的參數是在定義時評估的,而不是函數調用時的參數。因此,如果您在運行時更改'__default_options__',那麼'f1','f2'和'f'的默認值不會改變(這可能或可能不是您想要的) – 2013-03-22 12:12:06
我使用了下劃線,因爲我想讓用戶不用更改默認選項..如果他們想覆蓋值,他們必須調用函數,如f(x = 3),例如... – lucacerone 2013-03-22 13:26:59