我可以得到一个“未定义”符号的名称:
import sympy as sym
knodef = sym.Symbol('k_{nodef}')
print(type(knodef))
sym.pprint(knodef.name)
<class 'sympy.core.symbol.Symbol'>
k_{nodef}
但是,一旦我将其定义为表达式,就无法再获得名称了。
kdef = sym.Symbol('k_{def}')
kdef = sym.tan(b*x)
print(type(kdef))
sym.pprint(kdef.name) # AttributeError: 'tan' object has no attribute 'name'
tan
<Error raised>
如何获取kdef的名称?
类似的功能...
knodef2 = sym.Function('k_{nodef2}')
#display(disp.Math(knodef2.name), type(knodef2))
print(type(knodef2))
sym.pprint(knodef2.name)
<class 'sympy.core.function.UndefinedFunction'>
k_{nodef2}
...(在这种情况下是否等同于定义符号)?
答案 0 :(得分:4)
正如您所演示的,Symbol and Function的name
属性可用于返回“名称”的字符串形式。对于UndefinedFunction,您可以使用.func.name
来获取该字符串,但是对于已定义的FunctionClass,您可以仅在str
属性上使用func
:
>>> s=Symbol('s');f=Function('f');a=f(s);b=tan(s)
>>> s.name
's'
>>> f.name
'f'
>>> a.func.name
'f'
>>> str(b.func)
'tan'
答案 1 :(得分:1)
根据hpaulj的评论以及别有用心的实验和学习进行解答...
分配kdef = sym.Symbol('k_{def}')
分配名称'k_{def}'
,因为这是类sym.Symbol
的属性。
以后分配kdef = sym.tan(b*x)
只是定义了一个类sym.tan
的新对象,并使用kdef
作为其变量,但实际上与先前的对象无关。因此,在这一点上,kdef
和'k_{def}'
之间不再有关联。
这很容易发现:
kdef = sym.Symbol('k_{def}')
print('kdef = ', kdef, ', address = ', hex(id(kdef)), sep='')
kdef = sym.tan(b*x)
print('kdef = ', kdef, ', address = ', hex(id(kdef)), sep='')
kdef = k_{def}, address = 0x20f21b58228
kdef = tan(b*x), address = 0x20f21b584f8
甚至在分配相同类型的情况下也会发生这种情况,原则上可以使用相同的确切内存块:
q = 2.1
print('q = ', q, ', address = ', hex(id(q)), sep='')
q = 30000.1
print('q = ', q, ', address = ', hex(id(q)), sep='')
q = 2.1, address = 0x1c4dbd5d0d0
q = 30000.1, address = 0x1c4dbd5d2b0
此外,事实证明类sym.tan
没有name
,因此不可能获得它,因为它不存在。
由于给定的变量可能有或没有name
,因此可以简单地try
/ expect
,或用dir()
进行查询。