簡體   English   中英

如何使用變量 arguments / exec() 返回另一個 function 中的定義的子函數? (Python 3.x)

[英]How to return a sub-function with variable arguments / exec() a definition inside another function ? (Python 3.x)

我有一個foo function,它返回一個值,然后將其用作bar function 中的輸入。 簡而言之, baz = bar(foo(•), •)

現在,因為我想用一個保持不變的bar來測試多個foo迭代,所以我創建了make_baz function 以便根據迭代返回baz (即baz_i = bar(foo_i(•), •)等)

arguments 和關鍵字並不總是相同的,我不能像使用scipy.optimize.curve_fit那樣簡單地傳遞字典。

我找到了一種理論上做我想做的事情的方法(見下文),但似乎我無法在另一個 function 中定義一個帶有exec的 function (它在全球范圍內按預期工作)。

def foo_1(x, arg1, arg2, kwarg1=None):
    y = "some function of x"
    return y

def foo_2(x, arg1, kwarg1=None, kwarg2=None):
    y = "some other function of x"
    return y

def bar(y, bar_arg):
    z = "function of y"
    return z

def make_baz(foo):
    args = list(inspect.signature(foo).parameters)
    args_str = ", ".join(args)
    kwargs_str = ", ".join([f"{arg}={arg}" for arg in args])
    baz = f"def baz({args_str}, bar_arg):\n" \
          f"    y = {foo.__name__}({kwargs_str})\n" \
          f"    return bar(y=y, bar_arg=bar_arg)\n"
    exec(baz)
    return baz

print(make_baz(foo_1))
print(make_baz(foo_2))

問題:它返回字符串而不是實際函數。

"""
def baz(x, arg1, arg2, kwarg1, bar_arg):
    y = foo(x=x, arg1=arg1, arg2=arg2, kwarg1=kwarg1)
    return bar(y=y, bar_arg=bar_arg)
"""
"""
def baz(x, arg1, kwarg1, kwarg2, bar_arg):
    y = foo(x=x, arg1=arg1, kwarg1=kwarg1, kwarg2=kwarg2)
    return bar(y=y, bar_arg=bar_arg)
"""

問題:您有任何解決方法/解決方案嗎?

該解決方案已在 Python 2 和 Python 3 中的 exec function 的行為中找到,並將其定義loc = locals() exec的參數:()

def make_baz(foo):
    args = list(inspect.signature(foo).parameters)
    args_str = ", ".join(args)
    kwargs_str = ", ".join([f"{arg}={arg}" for arg in args])
    baz = f"def baz({args_str}, bar_arg):\n" \
          f"    y = foo({kwargs_str})\n" \
          f"    return bar(y=y, bar_arg=bar_arg)\n"
    loc = locals()
    exec(baz, globals(), loc)
    return loc["baz"]

編輯:為了讓exec識別bar ,我們必須添加globals()作為參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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