【问题标题】:Wrapper for an encapsulated function封装函数的包装器
【发布时间】:2021-02-27 18:01:28
【问题描述】:

假设 self.sigma 是一个浮点数,我定义了一个返回函数 a 的函数。

def f(self):
    a = lambda i: self.sigma*i**2
return a

现在我想扩展 a 的功能,只要 self.sigma 是一个矩阵:

self.sigma = sigma[i,j]

其中 sigma 是一个二维 numpy 数组。

是否可以定义一个包装器来做到这一点? 我想要类似的东西:

def f(self):
    a = lambda i,j: self.sigma[i,j]*i**2
return a 

没有明确地重写它。这是最好的方法吗?

附加信息: 在我的程序中 f 返回五个函数而不是一个。在程序的上下文中,将所有这些函数封装在一个函数 f 中是有意义的。

【问题讨论】:

  • 是否可以使用 switch/case 语句检查 self.sigmatype() 的类型并根据它返回的 lambda 来回答您的问题?如果不是,恐怕我不明白你说的“不想显式重写”是什么意思,“它”指的是什么
  • 是的,确实如此。但我试图找到另一个走动。我不想在 f 中写一行代码。这就是为什么我认为装饰器可能会有所帮助。

标签: python wrapper python-decorators


【解决方案1】:

也许np.vectorize 做了类似的事情?

向量化 f 将返回一个 lambda 矩阵。每个都以 i 作为输入。

import numpy as np

def f(sigma):
    a = lambda i: sigma*i**2
    return a

f_vectorized = np.vectorize(f)
sigma = [[0, 1], [2, 3], [4, 5]]

for i in [0, 1, 2]:
    for j in [0, 1]:
        print(f_vectorized(sigma)[i, j](i))

# prints 0, 0, 2, 3, 16, 20

【讨论】:

    【解决方案2】:

    如果您的 sigma 是一个 numpy 数组,您的 f 将按预期工作:

    import numpy as np
    
    def f(sigma):
        a = lambda i: sigma*i**2
        return a
    
    sigma = np.random.rand(2, 4)
    
    print(sigma)
    print(f(sigma)(2))
    
    # [[0.40567906 0.86706289 0.37468664 0.45059327]
    #  [0.57024244 0.17452584 0.05394594 0.03218902]]
    
    # [[1.62271624 3.46825154 1.49874657 1.80237307]
    #  [2.28096976 0.69810334 0.21578375 0.12875607]]
    

    如果您的 sigma 是列表列表,那么您可以使用 numpy 中的 vectorize 并获取函数数组:

    sigma = [[1, 2], [3, 4]]
    vfunc = np.vectorize(f)
    
    print(vfunc(sigma))
    #[[<function f.<locals>.<lambda> at 0x000002DC116DE7B8>
    #  <function f.<locals>.<lambda> at 0x000002DC116DEC80>]
    #
    # [<function f.<locals>.<lambda> at 0x000002DC116DEBF8>
    # <function f.<locals>.<lambda> at 0x000002DC116DE730>]]
    

    【讨论】:

    • print(f(sigma)(2)) 返回一个数组并且应该返回一个数字。
    • @FedericoVega 为什么它应该返回一个数字?你正在传递一个数组 - 你得到一个数组。你传递一个值 - 你得到一个值。
    • 对不起,你是对的,只是添加一些[i,j]来获得标量。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多