[英]The on_drop_file function in Kivy for python passes 5 arguments, but only 3 arguments are allowed in my drop function
[英]Wrapper function that reads arguments from file and then passes to subroutines in python3
我有一個運行多個子例程的包裝器 function。 而是定義包裝器 function 以獲取將傳遞給每個子例程的數百個輸入,我希望包裝器 function 讀取包含所有 ZDBC11CAA5BDA99F77E6FB4DABD882E7 的輸入文件傳遞給每個子例程
例如,給定一個名為eg_input.py
的輸入文件:
## example of argument file
a = [1]
b = [2]
c = [3]
d = [4]
e = [5]
f = [6]
我想要一個看起來像這樣的包裝器 function:
def wrap_fun(argument_file):
## read in the argument file
exec(open(argument_file).read())
## run first sub routine
sub_fun1(fun1_parma1=a, fun1_param2=b, fun1_param3=c)
## run second sub routine
sub_fun2(fun2_param1=d, fun2_param2=e, fun2_param3=f)
## run third sub routine
## note some arguments are shared between subroutines
sub_fun2(fun3_param1=a, fun3_param2=f)
## etc...
return()
這樣我就可以運行如下腳本:
wrap_fun(eg_input.py)
但是,當我運行與上述類似的代碼時,子程序無法使用 arguments。
你會注意到我在上面的例子中使用了exec()
function 但我並不堅持使用它,即如果有一個pythonic方法來完成這個我更喜歡那個解決方案。
我對這個問題的動機是能夠輕松生成各種輸入文件(同樣每個輸入文件包含 100 個參數)並觀察更改每個參數如何影響wrap_fun()
的結果。
謝謝!
您可以在exec
中為全局變量提供字典。 在執行的代碼中定義的任何全局變量都到了那里。 現在,當您調用函數時,請從該字典中讀取值。 由於 class 實例已經有一個字典,您可以將包裝器編寫為 class 以更新文件中的 class 實例,然后您可以編寫任意數量的實例方法來運行您的代碼。
# functions to call
def sub_fun1(fun1_param1="not"):
print("fun", fun1_param1)
def sub_fun2(fun2_param1="not"):
print("too", fun2_param1)
# option 1: use a dict
def wrap_fun(argument_file):
ns = {}
exec(open(argument_file).read(), ns)
print(ns.keys())
sub_fun1(fun1_param1=ns["a"])
# option 2: use instance dict
class FunRunner:
def __init__(self, argument_file):
exec(open(argument_file).read(), self.__dict__)
def have_some_fun(self):
sub_fun1(fun1_param1=self.a)
def have_more_fun(self):
sub_fun2(fun2_param1=self.b)
# write test file
fn = "my_test_args"
open(fn,"w").write("""a = [1]
b = [2]
c = [3]
d = [4]
e = [5]
f = [6]""")
# option1
wrap_fun(fn)
# option2 one shot
FunRunner(fn).have_some_fun()
# option2 multiple
fun = FunRunner(fn)
fun.have_some_fun()
fun.have_more_fun()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.