2013-10-06 3 views
1

Я главный виновный в достаточно большом пакете Python, который используется внутри нашей организации. Я занимаюсь подготовкой пакета для Python3; для кода, которым я управляю сам, это вполне выполнимо, но есть много сценариев «в дикой природе», которые будут ломаться, если/когда интерпретатор по умолчанию организации дергает до 3.x. Типичная ситуация выглядит следующим образом:Подготовка к python 3: выдавать предупреждения?

Некоторые случайные сценарий я не Conrol над:

#!/usr/bin/env python # By manipulating the environment I will ... 
         # ... eventually switch this to pick up python3 
import company.package # This is Python3 safe. 

... 
print "This - will fail hard" 

То, что я хотел бы сделать (если это возможно) было вставить некоторые глобальные директивы предупреждения в «компании. пакетный "код, который я контролирую, чтобы пользователи могли получить предупреждение до того, как глобальный интерпретатор подтянут до Python3. Это возможно?

+0

Предупреждение о чем? О пакете, который портирован на Python 3? О Python3-несовместимом синтаксисе? –

+0

Что сценарий имеет несовместимый синтаксис Python3, что в будущем приведет к жесткому сбою. В приведенном выше примере: print "...". – user422005

+0

Чтобы не нарушать код пользователя сразу, возможно, вы могли бы стремиться поддерживать как 2.x, так и 3.x? Практически каждый нетривиальный модуль, который в какой-то момент поддерживает 2.x, все еще поддерживает его (или, по крайней мере, поддерживал его для нескольких выпусков после внедрения поддержки 3.x). – delnan

ответ

3

Вы можете обнаружить, когда скрипт запускается в Python 2.x и выпустить обновление предупреждения, как это:

import warnings 
import sys 

if sys.version_info < (3,0): 
    warnings.warn("company.package will be ported to Python 3 soon. Make sure that your script is Py3k-safe!") 

К сожалению, нет никакого способа, чтобы гарантировать, что скрипт на Python будет работать бесперебойно в Python3, кроме инспекции человека на основе статического анализа (например, с помощью инструмента 2to3) и/или обширного модульного тестирования.

EDIT: Портирование на Python 3 - это не только синтаксис, но и переименование модуля (например, urllib, который был разделен, или cStringIO), и концептуальные изменения (например, определение bytearray/string). Нет волшебства import, чтобы проверить это.

+0

ОК - только глядя на версию, предупреждение будет выдаваться независимо от того, безопасен ли скрипт Py3K или нет ?! Но из вашего текста я предполагаю, что нет программного способа добиться того, чего я хочу? Я также рассмотрел этот https://mail.python.org/pipermail/python-dev/2008-September/082443.html ctypes, основанный на обмане, - но не сигары? – user422005

+0

Ни в коем случае. Флаг '-3', включенный с трюком в связанной электронной почте, будет обнаруживать только некоторые несовместимые с Python3 заявления. Он не гарантирует, что ваш код будет запущен в Py3k. Просто позвольте другим программистам узнать, что происходит переход, и пусть они выполняют свою работу, гарантируя, что их код совместим с Python3. –

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