2017-02-23 4 views
1

私のコードは次のとおりです。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'を取っていないと思います。

どうすれば修正できますか?

+0

しかし、角かっこは一致しませんか? –

+0

これは単なる誤字です。私は編集しました – user88914

+2

文字列を入力して返し、それを返します。私はあなたが入力を解析し、数学的関数として扱いたいと思いますか? –

答えて

1

式に変数名を使用する場合は、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) 
+0

ありがとうございます!できます! – user88914

0

このようなことをすれば、一致する引数でフォーマットされた式を得ることができます。例えば、この例では扱いませんでしたので、xxに置き換えますので、xsxを変数として使用すると動作しませんが、注意してください。発現を評価するように

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' 

安全astモジュールまたはpyparsingためhereを使用して入力の評価にhereに見えます。

sympyモジュールを使用する場合は、hereに使用例があります。ただし、sympyは安全とはみなされません。

関連する問題