2017-06-16 8 views
0

関数のパラメータの実装を理解しようとしています。例で質問したいと思います。Python 3で関数のパラメータを宣言する

def learningFunction(*entry,fileName=None): 

    if fileName is not None: 

     entry = open(fileName,'r').read() 

    else: 

     pass 

私は次のことを試みています。 、

  • 入力としてだけエントリ変数が存在することができる。パラメータの入力としてファイル名が存在することになる場合、関数は、(learningFunction(fileName="sample.txt")例えば)エントリパラメータを使用してはならない

    • (例えば:learningFunction("stackoverflow")

    これらの例の両方で動作するはずですが、 (learningFunction("stackoverflow",fileName="sample.txt")

  • +0

    あなたの例では、関数ではなく、メソッドであると推測しています。それにもかかわらず、あなたは以下のことを明確にすることができますか? "また、入力として変数を入力できるだけです" *。 –

    +0

    あなたはそうです、それは**機能**であってはならない方法であってはなりません。私はそれをもう少し明確にすると思います。 –

    +0

    今のところ、実際に動作します。 @SergeBallesta –

    答えて

    0

    個人的には、エントリとファイル名の両方に名前付きパラメータを使用します。 次に、あなたのコードは、この

    def learningFunction(entry=None, filename=None): 
        assert not entry!= None and filename!= None, "only one param please" 
        ... 
    

    のようになります。しかし、あなたは、あまりにも、あなたのセットアップを使用することができます。 *entryは任意の数のパラメータを受け入れ、それらをタプルとして格納します。 空のタプルがFalseと評価されます。

    あなたはこのようなコードを使用できます:あなたが使用することができます。ここ

    def learningFunction(*entry, filename=None): 
        if entry: 
         ... 
        else: 
    

    も、ただ一つのパラメータを確実にするために主張しています。

    if entry: 
        assert filename == None, "just one param please" 
    else: 
        .... 
    
    0

    あなたが望むものはありません。次の2つの引数(1はすべてpositionalsをつかん)で定義された機能を持っているし、それはあなたがこれらを指定する場合には機能しませ持つことができない、それは次のようになります。

    learningFunction("stackoverflow",fileName="sample.txt") 
    

    が正しいだろう。

    お客様内にロジックを追加することはもちろんこれを禁止する機能体です。 Pythonは完全に合法であるため、呼び出すときにPythonにエラーを投げ込ませることはできません。

    あなたが定義する引数の組み合わせが何であっても、これを得ることはできません。関数に2つの引数が必要な場合、2つの引数が渡された場合は常に受け入れられます。

    0

    Python3を使用しているときは、inspectモジュールを使用して、注釈機能でパラメータの検証を外部化できます。例えば、この1は、呼び出された関数のパラメータの一方のみが取り込まれていることを確認します:

    def singleparam(func): 
        sig = inspect.signature(func) 
        def wrapper(*args, **kwargs): 
         # controls that only one parameter has been populated 
         if len(sig.bind(*args, **kwargs).arguments) != 1: 
          raise TypeError("Both positional and keyword parameters") 
         return func(*args, **kwargs) # call original function 
        wrapper.__signature__ = sig  # keeps original signature 
        return wrapper 
    

    をあなたは彼らがあなたの関数を定義することができます:あなたはそれを呼び出す場合は、例外が発生します

    @singleparam 
    def learningFunction(*entry,fileName=None): 
        ... 
    

    をas learningFunction("stackoverflow",fileName="sample.txt")

    関連する問題