我的代码是:Python 3.x版本。要输入的功能
from sympy import symbols
x = symbols ('x')
def f(x):
y = input("what is your function?")
return y
print (f(1))
但如果我把X ** 2 + 3作为输入并运行代码,然后它打印X ** 2 +3 为什么出现这种情况?
我认为内置函数输入不会将'x'作为变量。
我该如何解决?
我的代码是:Python 3.x版本。要输入的功能
from sympy import symbols
x = symbols ('x')
def f(x):
y = input("what is your function?")
return y
print (f(1))
但如果我把X ** 2 + 3作为输入并运行代码,然后它打印X ** 2 +3 为什么出现这种情况?
我认为内置函数输入不会将'x'作为变量。
我该如何解决?
由于您想在表达式中使用变量名称,因此不能直接使用ast.litteral_eval
,这是(邪恶)eval
的安全替代方案。
至少你可以尝试从全球范围内移除内建的:
def f(x):
y = input("Function:")
return eval(y, {'__builtins__': {}}, {'x': x})
但要注意,即使有内建去除eval may not be safe
你也可以使用由史蒂芬提议的变动:
def g(**args):
y = input("Function:")
return eval(y, {'__builtins__': {}}, args)
非常感谢!有用! – user88914
你可以做这样的事情来得到一个表达式与任何匹配的参数格式化。虽然它不起作用,如果你有例如xs
和x
作为变量,因为x
将取代x
在xs
,因为我没有在这个例子中处理,所以要注意这一点。
def get_exp(**kwargs):
print(kwargs) # left in to show how kwargs looks
inp = input('--> ')
for k, v in kwargs.items():
inp = inp.replace(k, str(v))
return inp
# Use
>>> exp = get_exp(x = 5, y = 10)
{'x': 5, 'y': 10}
--> x ** 5 + (y - 2)
>>> exp
'5 ** 5 + (10 - 2)'
>>> exp = get_exp(x = 5, y = 10)
{'x': 5, 'y': 10}
--> z + x
>>> exp
'z + 5'
作为评价表达外观here使用ast
模块或here用于pyparsing
安全评估输入。
如果您想使用sympy
模块,则here有一个使用示例。但请注意sympy
不被认为是安全的。
但括号甚至不匹配? –
这只是一个错字错误。我编辑 – user88914
你得到一个带有输入的字符串,返回并打印它。我假设你想要输入被解析并作为数学函数处理? –