Python __future__ вне определенного модуля - PullRequest
5 голосов
/ 05 сентября 2011

В Python 2.7, используя

 from __future__ import division, print_function

Теперь я могу иметь print(1/2), показывая 0.5.

Однако возможно ли это автоматически импортировать при запуске Python?

Я пытался использовать специальный модуль sitecustomize.py, но входной файл действителен только внутри модуля, а не в оболочке.

Поскольку я уверен, что люди спросят, зачем мне это нужно: обучать подростков Python, я заметил, что целочисленное деление было для них непростым, поэтому мы решили перейти на Python 3. Однако одним из требований курса было быть в состоянии построить график, и Matplotlib довольно хорош, но действителен только для Python 2.7.

Таким образом, моя идея заключалась в том, чтобы использовать пользовательскую установку 2.7 ... не идеально, но у меня нет лучшей идеи иметь как Matplotlib, так и новое "естественное" деление "1/2 = 0.5".

Любой совет или, возможно, альтернатива Matplotlib, которая работает на Python 3.2?

Ответы [ 3 ]

6 голосов
/ 05 сентября 2011

matplotlib на python 3 ближе, чем вы думаете: https://github.com/matplotlib/matplotlib-py3; http://www.lfd.uci.edu/~gohlke/pythonlibs/#matplotlib.

Почему бы не использовать PYTHONSTARTUP вместо sitecustomize.py?

localhost-2:~ $ cat startup.py 
from __future__ import print_function
from __future__ import division
localhost-2:~ $ export PYTHONSTARTUP=""
localhost-2:~ $ python
Python 2.7.2 (v2.7.2:8527427914a2, Jun 11 2011, 15:22:34) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 1/2
0
>>> print("fred",end=",")
  File "<stdin>", line 1
    print("fred",end=",")
                    ^
SyntaxError: invalid syntax
>>> ^D
localhost-2:~ $ export PYTHONSTARTUP=startup.py
localhost-2:~ $ python
Python 2.7.2 (v2.7.2:8527427914a2, Jun 11 2011, 15:22:34) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 1/2
0.5
>>> print("fred",end=",")
fred,>>> 
2 голосов
/ 05 сентября 2011

Нет необходимости компилировать новую версию Python 2.x.Вы можете сделать это при запуске.

Как вы обнаружили, sitecustomize.py не работает.Это потому, что from __future__ import IDENTIFIER не импорт.Он помечает модуль для компиляции по специальным правилам.Любой модуль, использующий эти функции, должен иметь импорт __future__ и интерактивную консоль.

Следующая команда оболочки запустит интерактивную консоль с активными division и print_function:

python -ic "from __future__ import division, print_function"

Вы можете использовать псевдоним python (в linux) или настроить средство запуска, чтобы скрыть лишние вещи.

Если вы используете IDLE, сценарий PYTHONSTARTUP @DSM предлагает работать тамтакже.

Обратите внимание, что они не являются глобальными для всего интерпретатора, они влияют только на интерактивную консоль.Модули в файловой системе должны явно импортировать из __future__, чтобы использовать эту функцию.Если это проблема, я предлагаю создать шаблон для работы со всеми необходимыми импортами:

# True division
from __future__ import division

# Modules
import matplotlib

# ... code ...

def main():
    pass

if __name__ == "__main__":
    main()
0 голосов
/ 05 сентября 2011

Это может быть непрактично, но вы можете скомпилировать собственный Python с обратным переносом поведения деления Python 3Проблема с этим matplotlib может потребовать поведения Python 2 (хотя я не уверен).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...