2011-04-06 23 views
3

我需要給出一個自動構建的方法的位置和默認參數。如果我不關心參數名稱或默認值,我會使用* args和** kwargs。這裏是什麼,我試圖做一個例子(注意,在運行時創建的方法中設置參數名稱和默認值

def make_method(params): 
    # Create method that's parameters are defined in params. 
    return method 

params = {'param1': 'default_value', 'param2': None} 
method = make_method(params) 

對於每個非無值我想創建方法的位置參數和每個沒有價值我想創建一個默認參數。

的問題是,我不知道如何在運行時設置的參數名稱和默認值。我不想使用*指定參數和** kwars的方法,因爲它最好能夠有正確的簽名使用幫助()等時..有什麼辦法可以做到這一點?

+1

哇。不知道爲什麼你需要**這樣做,但這是一個有趣的問題(我沒有答案,我害怕)。 – Day 2011-04-06 00:16:47

+0

那天,我試圖從配置文件中自動構建一個程序,該文件包含方法名稱,參數,參數默認值列表以及該方法返回的規範。除了我希望help()函數更有用,並且我希望用戶能夠使用默認值以外,一切運行良好。 – nihlaak 2011-04-06 00:36:29

+0

我認爲PARAMS不應該是一個字典,因爲你不能以可預測的順序迭代生成參數。也許arg規範的元組列表是一個更好的設計。 – 2011-04-06 02:11:09

回答

1

這是一個黑客!而且我不知道我知道如何基於你問kwargs,但THI s是一個開始。雖然,我不知道這是否是一個好的開始:)

def make_method(params): 
    def impl(*args, **kwargs): 
     # do stuff with args & kwargs 
     print "I was called with {args} and {kwargs}".format(
      args=args, 
      kwargs=kwargs) 
     pass 
    name = 'some_name' 
    scope = dict(__impl=impl) 
    exec """\ 
def {name}({pos_arg_defs}): 
    'Very helpful function.' 
    return __impl({pos_arg_names}) 
""".format(name=name, 
      pos_arg_defs=', '.join('='.join((k, repr(v))) 
            for k, v in params.iteritems() 
            if v is not None), 
      pos_arg_names=', '.join(k 
            for k, v in params.iteritems() 
            if v is not None)) in scope 
    return scope[name] 

下面是一些REPL輸出:

 
>>> help(make_method(dict(foo=42, bar=None, zomg='abc'))) 
Help on function some_name: 

some_name(zomg='abc', foo=42) 
    Very helpful function. 
相關問題