2016-04-02 98 views
1

C++では、シグネチャが異なる限り、同じ名前の2つの関数を作成できます。 したがって、たとえばmyfunc(int x)myfunc(float x)とは異なります。 Pythonではこれを行うことはできませんので、異なる名前の関数を定義する必要がありますか、それともこの状況を処理する良い方法がありますか?Pythonの関数シグネチャ

+1

まあ、 'myfunc'が、それはだかどうかをX ''に同じことをしている場合'int'または' float'を使用すると、1つの関数しか必要としません。そして、その型に応じて 'x 'に異なるものをしたいのであれば、2つの異なる名前を持つ2つの異なる関数を持つ方が一般的には良いですが、argの型を決定し、をしたい。 –

答えて

2

Pythonは、引数が整数か浮動小数点かはまったく気にしません。 は、動的にタイプされたです。たとえば、次のようにすることができます。

def SquareMe(num): 
    return num**2 

そして、この機能を任意の番号で呼び出すことができます。

これを行うことも可能です:(!)これは、数値、文字列で動作します

def MultMe(data): 
    return data*2 

、アレイ(!!)といくつかのクラスがメソッドを提供する場合(数で乗算することができます何もこのため)。

+0

真実ですが、時には異なることをしたいことがあります。たとえば、floatの代わりに文字列を渡すとします。 – user

1

pythonでは、1つのメソッドしか作成する必要はありませんが、どの引数が渡されるかを調べることができます。また、引数が異なる場合(つまり、floatとintが異なる場合)、2つの関数。あなたは機能自体は種類やパラメータの数に基づいて異なることを行う可能性があり

def myfunc(*args): 
# do something 

# when you call the method 
myfunc(a1, a2, k1=a3, k2=a4) 

# you get: 
args = (a1, a2) 
kwds = {'k1':a3, 'k2':a4} 

#So now lets recreate myfunc to check arguments 
def myfunc(*args): 

    if isinstance(args[0], str): #This is where you determine argument type 
     # do what you want to do if argument is string 

    elif isinstance(args[1], int): 
     # do what you want to do if argument is an int 
+0

引数が型の場合、実際にはブール値を取得します(例:string)。 –

0

:コードでは、これは次のようになります。 Python3.4 +で

def f (a): 
    if type (a) == 'float' or type (a) == 'int': 
      ... 
    if type (a) == 'list': 
      ... 
    if type (a) == 'dict': 
      ... 
+1

私のPython 2.7は 'type(6)'の結果として ''を返します。したがって、おそらく 'type'の戻り値をそのような文字列と簡単に比較することはできません。 – ForceBru

3

あなたは、一般的な関数を定義し、それに対して入力された実装を登録することができますfunctools.singledispatchデコレータを使用することができます。

>>> from functools import singledispatch 
>>> @singledispatch 
... def fun(arg, verbose=False): 
...  if verbose: 
...   print("Let me just say,", end=" ") 
...  print(arg) 

型指定された機能:docs

ジェネリック関数から

>>> @fun.register(int) 
... def _(arg, verbose=False): 
...  if verbose: 
...   print("Strength in numbers, eh?", end=" ") 
...  print(arg) 
... 

>>> @fun.register(list) 
... def _(arg, verbose=False): 
...  if verbose: 
...   print("Enumerate this:") 
...  for i, elem in enumerate(arg): 
...   print(i, elem) 

ありパイソンの以前のリリースのためのビルトインソリューションませんが、グイド・ヴァンロッサムbloggedについてデコレータを使用してpython2のためのソリューション。 (編集:ニシキヘビ2.6 3.4機能のバックポートもある - pypiオン3.3)

編集:もちろん 、パイソンを使用することの利点の1つは、同じ符号がしばしばint値を扱うことができることであるとせずに浮いタイプ上の明示的なディスパッチは、機能が最近追加されたばかりの理由の1つです。

+0

ありがとう、私は2.7を使用していますが、私はすぐにアップグレードされるので、これを書き留めておきます。 – user

+0

問題ありません - Python2.6で動作するバックポートのpypiリンクを指している間に編集を追加しました。 – snakecharmerb

1

ForceBruは、Pythonは本当にあなたが行うので、もし、あなたがそれを自分で処理することができ、パラメータの型を気にdosen't言ったように:

def myfunc(x): 
    if(isinstance(x,int)): 
     print (x, 'int') # as myfunc(int x) 
    if(isinstance(x,float)): 
     print (x, 'float') # as myfunc(float x) 

myfunc(10) # 10 int 
myfunc(10.2) # 10.2 float 
myfunc ("A") # 
関連する問題