2016-03-09 34 views
1

我導入兩個不同的模塊,都覆蓋標準的數學函數,例如,登錄()。我有幾種不同的方式來解決這個衝突。這將是最pythonic?大多數pythonic方式來處理導入的函數覆蓋衝突

選項1:

from pyomo.environ import * 
import casadi 

def coolFunction(): 
    pyomo_x = Var() 
    pyomo_f = log(x) 

def niceFunction(): 
    casadi_x = casadi.SX.sym('x') 
    casadi_f = casadi.log(x) 

選項2:

from pyomo.environ import * 

def coolFunction(): 
    pyomo_x = Var() 
    pyomo_f = log(x) 

def niceFunction(): 
    from casadi import * 
    casadi_x = SX.sym('x') 
    casadi_f = casadi.log(x) 

方案3:

??? 
+6

不要使用'*',你不會有問題,你正在污染你的名字空間,如果需要的話,導入你想明確給出別名的東西 –

+1

Yuck。 Python的'using namespace std;'。 – erip

+3

選項3絕對更好。 – chepner

回答

4

不要使用from something import *。請使用import somethingfrom something import foo, bar, ...

如果要導入功能的第二種方式,並與來自兩個不同的模塊兩個名稱相同的功能,你可以寫:

from module_a import log as a_log 
from module_b import log as b_log 

由於PM 2Ring在評論中指出的那樣,你也可以使用as重命名模塊的東西更短,爲了保持層次:

import module_a as ma 
import module_b as mb 
... 
ma.log(...) 
+2

另一種選擇是用短名稱導入模塊。例如,'import module_a as ma',可以讓''ma.log(x)'代替'module_a.log(x)' –

+1

你也可以用'from ...'來使用它; '從module_a將日誌導入爲ma_log'。 – chepner

3

只需導入模塊,並給他們明確的,短的名稱,例如:

import pyomo.environ as omo 
import casadi 

def coolFunction(): 
    pyomo_x = omo.Var() 
    pyomo_f = omo.log(x) 

def niceFunction(): 
    casadi_x = casadi.SX.sym('x') 
    casadi_f = casadi.log(x) 

請勿使用from xy import *或在函數內部導入。你應該總是立即看到哪些名稱被導入以及模塊具有哪些依賴關係。