2017-01-27 5 views
1

これは私の最初の投稿です、と私は我慢してください(Pythonの3が私の第一言語である)のコーディングに新人だ:)超越関数のユーザー入力文字列が数学モジュールに存在するかどうかをチェックする方法を教えてください。

私がしようとするために検索する機能を何でもないアイデア(またはを持っていません

user_fn_str = str(input("Type a transcendental function in this form: e.g. 'sin' or 'exp'")) 

と、ユーザが入力したと言う:

を、ユーザーが超越関数は数学モジュールに存在する有効なものであり、入力されたことを確認するために、whileループを使用することができますいくつかのコードを書くためにどのように)自分自身を学びます
sim 

チェックは失敗し(math.simは存在しません)、有効な入力があるまでwhileループに残ります。

ありがとうございます。

答えて

4

あなたは次のようにmathdir(..)を検査することができます

import math 

name in dir(math) 

しかし、これはまた、あなた'__doc__''pi'のようなもののためにTrueを与えるので、あなたはそれが機能であること保証はありません。

それでは、あなたがしなければならないことは、属性を取得し、それはそれに接続__call__'属性を持っているか否かをチェックすることによって呼び出し可能であれば検査です。

def is_math_function(funcname): 
    return hasattr(getattr(math,funcname,None),'__call__') 

がワンライナーにするために:Noneは何__call__を持っていないので、あなたは、単に状態できるようにするには、これをさらに最適化することができ

import math 

def is_math_function(funcname): 
    func = getattr(math,funcname,None) 
    return func is not None and hasattr(func, '__call__') 

:完全なテストは、このように何かのようになります。

いくつかの追加の注意事項:

  • テストが成功した場合は、はそれが数学関数であること自体を意味するものではありません:mathは、例えばisnanのようないくつかの追加機能が含まれている可能性(OK、あなたができますそれが数学的関数であるかどうか議論する)。そして
  • それは引数の数については何も言っていない、それは(例えばmath.sin用)いずれかになりますが、そこに複数のこと(または厳密にさえ引数を話すませんが、おそらくそれはmathためのケースではありません)でした。
+1

ニースと完全な回答! – iFlo

+0

@ tagc:ユーザーが「*超越関数をタイプしたユーザーが有効なものだ」と言った*。私はこれを次のように解釈しています:「ユーザーは超越的であることを知っている機能を入力しますが、質問は「数学」でサポートされていますか? –

+0

@WillemVanOnsemそれは理にかなっています。 – Tagc

3

hasattrの組み込み関数を使用できます。

import math 
s1 = 'sim' 
assert not hasattr(math, s1) 
s2 = 'sin' 
assert hasattr(math, s2) 
関連する問題