2014-02-26 35 views
1

$蟒蛇example.py --function COS(x)的的Python:從命令行傳遞一個庫函數

x = [...] 

def foo(f, x): 
    return f(x) 

有一個聰明的辦法我可以傳遞任何函數(比方說在numpy的定義的數學函數用於從所述命令行簡單),這樣它會產生將會產生以下的代碼相同的結果:

foo(lambda t: numpy.cos(t), x) 
+1

你幾乎立即就會遇到解析問題; [SymPy](http://sympy.org/en/index.html)可能會對你感興趣。要從命令行獲取值,只需使用[argparse](http://docs.python.org/2/library/argparse.html)。 –

回答

1

正如已指定python2.7,可以使用import_module函數從反向移植importlib模塊。

>>> np = importlib.import_module('numpy') 
>>> cos = getattr(np, 'cos') 
>>> cos 
<ufunc 'cos'> 
>>> cos(3.14159) 
-0.99999999999647926 

您需要(使用​​作爲@HenryKeiter建議在評論)解析命令行選項,然後從模塊字符串分割功能,導入模塊,並使用GETATTR訪問功能。

>>> def loadfunc(dotted_string): 
...  params = dotted_string.split('.') 
...  func = params[-1] 
...  module = '.'.join(params[:-1]) 
...  mod = importlib.import_module(module) 
...  return getattr(mod, func) 
... 
>>> loadfunc('os.getcwd') 
<built-in function getcwd> 
>>> loadfunc('numpy.sin') 
<ufunc 'sin'> 
>>> f = loadfunc('numpy.cos') 
>>> f(3.14159) 
-0.99999999999647926 

請注意,這不會從全局名稱空間加載函數,您可能想要添加一些錯誤檢查。

編輯

也有在這一行不需要lambda函數

foo(lambda t: numpy.cos(t), x) 

您只需直接傳遞numpy.cos沒有評估它

foo(numpy.cos, x)