2

以下を試すと、function definitionそれ自体にエラーが発生します。

>>> def mymap(*seq,pad=None):
  File "<stdin>", line 1
    def mymap(*seq,pad=None):
   SyntaxError: invalid syntax 

パラメータのデフォルト値を指定しようとしていますpad

しかし、私はこれを試してみましたが、うまくいきました(間違った理由で):

>>> def mymap(pad=None,*seq):
...    print seq
>>> mymap([1,2,3],[4,5,6])
([4, 5, 6],)
[(4,)]
>>> 

tupleのはずのを印刷してseqいません([1,2,3],[4,5,6])

4

2 に答える 2

6

ここで本当に必要なのは、 forpadをキーワードのみのパラメーターにすることです。

3.0 での主な変更点の 1 つは、関数のパラメーターと引数の設計であり、とりわけ、探している機能を正確に提供することでした。実際、最初のバージョンは期待どおりに動作します。しかし、2.x を使い続けたい場合は、3.x の新機能をまったく利用できません。

したがって、それを偽造するしかありません。

def mymap(*seq, **kwargs):
    pad = kwargs.pop('pad', None)
    if kwargs:
        raise TypeError("mymap() got an unexpected keyword argument '{}'".format(kwargs.keys()[0]))
    print seq

これは、同等の Python 3 コードとほぼ同じことを行います。もちろん、それはより複雑で、はるかに明確ではなく、遅く、内省するのに不透明です.3.0 でキーワードのみのパラメーターが追加されたのは、まさにそのためです。しかし、それが必要で、Python 3.x を使用できない場合は、これを行う必要があります。(あなたが C-API 関数を書こうとしているのではないことを嬉しく思います。)


あなたは2つの完全に独立したものを混同しているようです:デフォルト値を持つパラメータ(これは、「デフォルトパラメータ」という用語が意味するものであり、実際には何も意味しないと思います)、およびキーワードのみです。

2 番目のバージョンでは、既定値を持つパラメーターを既に取得しています。これは簡単にmymap()わかりpadます。Noneseq

ただし、最初の位置引数を盗まないように、キーワードのみのパラメーターにもする必要がありますそして、それは 2.x ではできない部分です。


詳細を知りたい場合は、PEP 3012でキーワードのみの機能について説明し、Arguments とパラメーターは、関連するすべてのドキュメント リンクを収集し、すべてがどのように組み合わされるかを要約しようとします。

于 2014-01-06T23:34:24.987 に答える
1

[1,2,3]引数を2 つの別々の引数として入力しているようです[4,5,6]。それらはタプルにはありません。

mymap([1,2,3], [4,5,6])<< この例では、コードから、[1,2,3]が pad[4,5,6]に渡され、 が seq に渡されています。そのため、seq を印刷すると、[4,5,6]

また、 のような名前付き引数は、またはpadの前に置く必要があります。*args**kwargs

例えば:

mymap(None, [1,2,3],[4,5,6]) #passing None for pad

プリント:

([1,2,3], [4,5,6])
于 2014-01-06T23:28:07.603 に答える