-1

私はPythonを学んでいて、誰かがこの関数が段階的に何をするのかを分解して理解するのを手伝ってくれるかどうかを見たいと思っていましたか?

def label(self, index, *args): 
    """ 
    Label each axes one at a time 
    args are of the form <label 1>,...,<label n> 
    APIPARAM: chxl 
    """ 
    self.data['labels'].append( 
    str('%s:|%s'%(index, '|'.join(map(str,args)) )).replace('None','') 
    ) 
    return self.parent 
4

3 に答える 3

3

何をするのかを理解する前に、フォーマットを変更することをお勧めします。

def label(self, index, *args): 
    """ 
    Label each axes one at a time 
    args are of the form <label 1>,...,<label n> 
    APIPARAM: chxl 
    """ 
    self.data['labels'].append( 
        str( '%s:|%s' % \ 
            ( index, '|'.join( map( str,args ) ) ) 
        ).replace( 'None', '' ) 
    ) 
    return self.parent 

それで:

リストに何かを追加しself.data[ 'labels' ]ます。はリストオブジェクトappend()のメソッドであるため、これを知っています。

これは次のような文字列です。

  • 文字列の形式はxxx:|yyy
  • xxx引数の値に置き換えられますindex
  • yyy文字列()に変換され、文字( map(str,args))で結合された他のすべての引数に置き換えられるため、結果は' 'のようになります。|join(...)a|b|None|c
  • 上記の文字列に出現するすべてNoneの文字列は空の文字列に置き換えられ、これがリストに追加されます

編集:

@abarnertが指摘したように、それが何を*args意味するのか、そしてなぜ後でそれがとして使用されるのかを説明するのは良いかもしれないargsので、ここに行きます。

*args(アスタリスク+任意の名前)は、「argsリスト内でさらに利用可能な任意の数の匿名引数」を意味します。キーワード付き引数を受け入れるために使用**kwargsされる2つのアスタリスクに注意してください。つまり、は引数の名前であり、単なる。ではなくその値でfoo = barあるという形式で関数に渡されるアスタリスクです。foobarbar

args上で述べたように、kwargs任意ですが、*potatoes使用する**potatoesことも、使用することもできます。これはPythonの規則です(場合によっては、の代わりに使用することもありますが、意味は同じです。それぞれ、任意の数の匿名引数と任意の数のキーワード引数です)。argskwargs**kw**kwargs

関数/メソッドが受け入れる必要のある引数の数が事前にわからない場合は、両方が使用されます。たとえば、パーティーゲストの名前を処理する関数を考えてみましょう。その数がわからない場合があるため、次の関数を定義すると次のようになります。検出:

def add_party_quests( *quests ):
    for guest in quests:
        do_some_processing( guest )

次に、以下の両方の呼び出しが有効です。

add_party_guests( 'John' )
add_party_guests( 'Beth', 'Tim', 'Fred' )

これは、このSO投稿でも説明されています:https ://stackoverflow.com/a/287101/680238

于 2012-10-24T21:55:48.917 に答える
2

誤解を招く行は次のとおりだと思います。

self.data['labels'].append( 
str('%s:|%s'%(index, '|'.join(map(str,args)) )).replace('None','') 
)

それらは、読みやすくするために、より明確にフォーマットすることができます。

self.data['labels'].append( 
    str('%s:|%s' % (
        index,
        '|'.join(map(str, args))
    )).replace('None', '') 
)

しかし、次のように書き直すことができます。

self.data['labels'].append(  # append to the list at `self.data['labels']`
    '%s:|%s' % (             # a string of the format X:|Y
        index,               # where X is the index
        '|'.join(            # and Y is a list joined with '|'s
            str(arg) if arg is not None else  # with each item in the list
            '' for arg in args                # being it's string representation
        )
    )
)
于 2012-10-24T21:56:17.613 に答える
1

*argsargsと呼ばれる引数のリストに変わります。 self.data['labels']リストのようです。.appendは、リストにアイテムを追加します。追加された項目は、右端の部分によって返される文字列によって返されますreplace。文字列が何であるかを解析するには、parensの内部から始めて、作業を進めます。 map(str,args)すべての引数を文字列に変換し、そのリストを返します。 '|'.join(マップの出力を取得し、それを一般的なパターンの単一の文字列に結合しelem1|elem2|elem3...、フォーマット文字列を使用します'%s:|%s'。1つ目%sはインデックスの値に置き換えられ、2つ目は。によって出力される文字列に置き換えられます'|'.join。次に、この文字列に対してreplaceを呼び出し、すべての出現箇所'None'を。に置き換えます''。次に、self.parentを返します。

于 2012-10-24T21:54:43.437 に答える