2010-07-17 2 views
1

Есть несколько modules that were renamed in Python 3 и я ищу решение, которое поможет вашему коду работать в как ароматов python.Как использовать модули python, которые были переименованы 3 в перекрестном режиме?

В Python 3, __builtin__ было переименовано в builtins. Пример:

import __builtin__ 
#... 
__builtin__.something # appearing multiple times ("something" may vary) 

ответ

3

Benjamin Peterson's six может быть тем, что вы ищете. Six "предоставляет простые утилиты для переноса различий между Python 2 и Python 3". Например:

from six.moves import builtin # works for both python 2 and 3 
+0

Спасибо, что решает еще больше проблем, связанных с py3. Вы можете немного улучшить ответ, включая небольшое описание этого модуля (только для других читателей). Замечание: шесть очень мало, и его легко включить в пакет, чтобы минимизировать зависимости. – sorin

+0

Машина времени снова поражает: я просто сделал. –

+0

Это больше не работает в шести-1.0b1. Попробуйте импортировать шесть; six.moves.builtin'. –

1

Вы могли бы решить эту проблему с помощью вложенных try .. except -блоков:

try: 
    name = __builtins__.name 
except NameError: 
    try: 
     name = builtins.name 
    except NameError: 
     name = __buildins__.name 
     # if this will fail, the exception will be raised 

Это не реальный код, только пример, но name будет иметь собственное содержание, независимое от версии , Внутри блоков можно также import newname as oldname или копировать значения из нового глобального builtins к старому __buildin__:

try: 
    __builtins__ = builtins 
except NameError: 
    try: 
     __builtins__ = buildins # just for example 
    except NameError: 
     __builtins__ = __buildins__ 
     # if this will fail, the exception will be raised 

Теперь вы можете использовать __builtins__ так же, как и в предыдущих питона-версий.

Надеюсь, это поможет!

+0

Извините, но «что-то» может отличаться. Я изменил вопрос, чтобы прояснить это. – sorin