1
$蟒蛇example.py --function COS(x)的的Python:從命令行傳遞一個庫函數
x = [...]
def foo(f, x):
return f(x)
有一個聰明的辦法我可以傳遞任何函數(比方說在numpy的定義的數學函數用於從所述命令行簡單),這樣它會產生將會產生以下的代碼相同的結果:
foo(lambda t: numpy.cos(t), x)
$蟒蛇example.py --function COS(x)的的Python:從命令行傳遞一個庫函數
x = [...]
def foo(f, x):
return f(x)
有一個聰明的辦法我可以傳遞任何函數(比方說在numpy的定義的數學函數用於從所述命令行簡單),這樣它會產生將會產生以下的代碼相同的結果:
foo(lambda t: numpy.cos(t), x)
正如已指定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)
你幾乎立即就會遇到解析問題; [SymPy](http://sympy.org/en/index.html)可能會對你感興趣。要從命令行獲取值,只需使用[argparse](http://docs.python.org/2/library/argparse.html)。 –