2017-06-02 62 views
1

此代碼正常工作以增加幫助文本的寬度,但尚不清楚。什麼是lambda函數在做什麼?說明lambda argparse.HelpFormatter(prog,width)

編輯:爲了澄清,問題不在於爲什麼lambda函數一般有用,而是如何使用lambda函數參數解析器初始化代碼?

import argparse 
import sys 

formatter = lambda prog: argparse.HelpFormatter(prog, width=100) 

dummy_text = """Lorem ipsum dolor sit amet, consectetur adipiscing elit, 
    sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut 
    enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi 
    ut aliquip ex ea commodo consequat. Duis aute irure dolor in 
    reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla 
    pariatur. Excepteur sint occaecat cupidatat non proident, sunt in 
    culpa qui officia deserunt mollit anim id est laborum.""" 

parser = argparse.ArgumentParser(description=dummy_text, formatter_class=formatter) 

parser.add_argument("-e", dest="destE", help=dummy_text) 
parser.add_argument("-w", dest="destW", help=dummy_text) 
args = parser.parse_args(sys.argv) 
+1

這基本上是做一個'argparse.HelpFormatter'的定製版本,它自動爲其第二個參數提供100。 – jasonharper

+0

可能重複[爲什麼Python lambda有用?](https://stackoverflow.com/questions/890128/why-are-python-lambdas-useful) –

回答

1

這是__init__默認HelpFormatter類:

def __init__(self, 
      prog, 
      indent_increment=2, 
      max_help_position=24, 
      width=None): 

ArgumentParser類使用這個功能來獲取一個格式化的實例。 format_help使用此實例創建幫助消息。

def _get_formatter(self): 
    return self.formatter_class(prog=self.prog) 

其中self.formatter_class是您設置的參數。所以默認調用只設置prog參數。

formatter = lambda prog: argparse.HelpFormatter(prog, width=100) 

調用HelpFormatter與另外width參數。

這裏是lambda等效採用了簡單的功能:

In [176]: def foo(x,y): 
    ...:  return x,y 
    ...: 
In [177]: bar = lambda y: foo('x_str',y) 
In [178]: bar('y_str') 
Out[178]: ('x_str', 'y_str') 

有做同樣的事情的其他方式,如

def formatter(prog): 
    return argparse.HelpFormatter(prog, width=100) 

HelpFormatter子類。

-1

這裏的lambda簡單地「修復」了argparse.HelpFormatter構造函數的其中一個參數。 argparse.ArgumentParserformatter參數接受一個在其構造函數中接受一個參數的類。我們希望將其他命名參數傳遞給我們正在使用的呼叫...即width=100。要做到這一點的方法是創建第二個構造函數,它採用與argparse.HelpFormatter相同的位置參數,但在調用中「修復」width=100

當傳遞函數作爲參數時,這是一個常見的範例。另一個常見的例子是函數接受一個需要一個變量函數的參數。我們有兩個變量的函數,我們想通過其中一個變量「固定」,所以我們使用new_func = lambda x: old_func(x, 5)。結帳functools.partial

+0

我不明白倒票。這正是他們正在做的以及他們爲什麼這樣做的原因。我始終使用相同的範例來修復參數。 – Scott

+0

是的,問題是「lambda函數是如何工作的?」。如果您通過閱讀教程或閱讀上面鏈接的重複目標來了解任何可以學習到的信息,那麼您就不應該首先回答問題。堆棧溢出不是教程服務。更不用說重新命名lambda,這種方式是反模式。 –

+0

問題不是「lambda函數是如何工作的?」。請重新閱讀這個問題。這也不是他的代碼,所以它是否是反模式是無關緊要的。他只是想了解代碼作者爲什麼會用lambda函數做什麼的原因,並且,如果不是真正的讀者,我肯定這是他們的想法。 – Scott