簡體   English   中英

包裝器 function 從文件中讀取 arguments 然后傳遞到 python3 中的子例程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM