1

假设我有一个包含一些数值的容器类:

class Container:
    def __init__(self, value):
        self.value = value

我想给那些Containers 一个lambdified sympy 表达式,结果得到一个新的Container

import sympy as sp
a = Container(1)
b = Container(-0.5)
x, y = sp.symbols("x y")
f = sp.lambdify((x, y), sp.atan(x)**-1*sp.pi*10 - 1/y)
result = f(a, b) # result should be a Container with value 42

现在我实际上不介意围绕f解包和打包值编写一些包装器,但问题出现在这里:

就像在 Numpy 中一样,我也希望它能够处理列表或与值混合的列表:

a = Container(-47)
b = Container(19)
c = [Container(0), Container(1), Container(2), Container(3), Container(4)]
x, y, z = sp.symbols("x y z")
f = sp.lambdify((x, y, z), z**4 + x/6*z**3 + y*z**2 + (x-2*y)/6*z + 3)
result = f(a, b, c) # should be a list of Containers with values 3, 1, 4, 1 and 5

实现这一目标的优雅方法是什么?

编辑

我已经围绕 lambdify 编写了一个包装函数,它在应用 sympy 表达式之前解包值并打包结果,但它涉及检查参数的类型是 alist还是 a Container,这违背了 Python 的整个鸭子类型哲学。我的实际问题是:有没有更 Pythonic 的方式来做到这一点,不涉及丑陋的类型检查?

4

0 回答 0