如何判断SymPy通过sympify()解析的函数是否为内置函数?
区分SymPy内置函数与自定义未知函数
当你通过sympify()解析混合内置函数和自定义未知函数的表达式时,可以通过检查函数的构造器是否为UndefinedFunction实例来区分两者,实现你需要的筛选效果。
实现代码
import sympy as sp from sympy.core.function import UndefinedFunction def is_sympy_defined(func): # 内置函数的构造器不是UndefinedFunction实例,自定义未知函数则是 return not isinstance(func.func, UndefinedFunction) # 测试示例 expr = sp.sympify("sin(x) + foo(y)") funcs = expr.atoms(sp.Function) # 筛选SymPy内置函数 print([f for f in funcs if is_sympy_defined(f)]) # 输出: [sin(x)] # 筛选自定义未知函数 print([f for f in funcs if not is_sympy_defined(f)]) # 输出: [foo(y)]
原理说明
- SymPy解析未知函数名(如
foo)时,会自动创建一个UndefinedFunction的实例作为该函数的构造器(即foo(y).func是UndefinedFunction类型)。 - 内置函数(如
sin)对应的是SymPy官方实现的具体函数类(如sympy.functions.elementary.trigonometric.sin),其构造器并非UndefinedFunction实例,因此可以通过这个属性直接区分。
额外说明
如果你自己定义了继承自sp.Function的自定义函数(而非通过字符串解析生成的未知函数),该函数的构造器也不是UndefinedFunction实例,但它不属于SymPy内置函数。如果需要区分这类函数和SymPy原生内置函数,可以进一步检查构造器的模块是否以sympy.开头:
def is_sympy_defined_strict(func): from sympy.core.function import UndefinedFunction if isinstance(func.func, UndefinedFunction): return False # 仅识别SymPy官方模块下的函数 return func.func.__module__.startswith('sympy.')
内容的提问来源于stack exchange,提问作者rijkdw
相关产品推荐
相关产品推荐

