2016-03-09 2 views
1

Я импортирую два разных модуля, которые переопределяют стандартные математические функции, например. журнал(). У меня есть несколько разных способов разрешения этого конфликта. Что было бы самым пифоническим?Большинство 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. «использование пространства имен std;» из Python. – erip

+3

Вариант 3 определенно лучше. – chepner

ответ

4

Не используйте from something import *. Используйте либо import something, либо from 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 ...'; 'из журнала импорта mod_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 * или импортируйте внутри функций. Вы должны всегда видеть сразу, какие имена импортируются и какие зависимости имеет модуль.

Смежные вопросы