Почти все программы Python 2 нуждаются в некоторых изменениях, чтобы нормально работать в среде Python 3. Чтобы упростить этот процесс преобразования, Python 3 поставляется с практическим скриптом, называемым 2to3 (Utility Script), который принимает исходные файлы вашей программы Python 2 в качестве ввода, а затем автоматически преобразует их в форму Python 3.
В Python 2 print - это предложение. Что бы вы ни хотели вывести, вы можете сделать это, просто поместив их за ключевым словом print. В Python 3 print () - это функция. Как и другие функции, print () требует, чтобы вы передали в качестве параметров то, что вы хотите вывести.
Notes | Python 2 | Python 3 |
---|---|---|
① | print() | |
② | print 1 | print(1) |
③ | print 1,2 | print(1,2) |
④ | print 1,2, | print(1,2,end=’ ‘) |
⑤ | print >>sys.stderr,1,2,3 | print(1,2,3, file=sys.stderr) |
В Python 2 существует два типа струн:Строка UnicodeиНеуникодные строкиВ Python 3 есть только один тип:Unicode strings (Уникодные строки)。
Notes | Python 2 | Python 3 |
---|---|---|
① | u’PapayaWhip’ | ‘PapayaWhip’ |
② | ur’PapayaWhip\foo’ | r’PapayaWhip\foo’ |
Unicode-стринги в Python 2 являются обычными в Python 3, поскольку в Python 3 они всегда имеют форму △. Unicode raw string ((raw string) (() использует эту строку, Python не переводит обратную скобку автоматически”“) также заменен на обычные строки, так как в Python 3 все исходные строки кодируются в Unicode .
В Python 2 есть две глобальные функции, которые могут принудительно преобразовывать объекты в строки: unicode ((() преобразовывает объекты в Unicode строки, и str ((() преобразовывает объекты в не-Unicode строки. В Python 3 есть только один тип строки, Unicode строки, поэтому str ((() функция может выполнять все функции.Функция unicode() больше не существует в Python 3.)
Notes | Python 2 | Python 3 |
---|---|---|
① | unicode(anything) | str(anything) |
В Python 2 имеются типы int и long для не-флоктовых чисел. Максимальное значение типа int не может превышать sys.maxint, и это максимальное значение зависит от платформы. Длинные целочисленные типы можно определить, прикрепив L к концу числа, что, очевидно, больше, чем числовой диапазон, обозначенный типом int.
PEP 237: унификация длинных и целых типов.
Notes | Python 2 | Python 3 |
---|---|---|
① | x = 1000000000000L | x = 1000000000000 |
② | x = 0xFFFFFFFFFFFFL | x = 0xFFFFFFFFFFFF |
③ | long(x) | int(x) |
④ | type(x) is long | type(x) is int |
⑤ | isinstance(x,long) | isinstance(x,int) |
В Python 2 десятичное длинное целое число было заменено на обычное десятичное целое число в Python 3. В Python 2 шестнадцатизначный длинный целочисленный тип заменен в Python 3 обычным шестнадцатизначным целочисленным числом. В Python 3 нет более длинных целостных типов, поэтому мы можем использовать их для создания более длинных целых типов.Природная функция long () также отсутствует. Для принудительного преобразования переменной в целостный тип можно использовать функцию int ()。 Проверка целостности переменной, получение ее типа данных и сравнение с переменной типа int ((не long)). Вы также можете использовать функцию insinstance () для проверки типа данных; подчеркнем, что для проверки типа целых чисел используйте int, а не long.
Python 2 поддерживает <> как синоним!=. Python 3 поддерживает только!=, больше не поддерживает <>.
Notes | Python 2 | Python 3 |
---|---|---|
① | if x <> y: | if x != y: |
② | if x <> y<> z: | if x != y!= z: |
В Python 2 словарный объект has_key ((() - метод, используемый для проверки того, содержит ли словарь определенную клавишу (((key) . Этот метод больше не поддерживается в Python 3 . Вам нужно использоватьinОператор
Notes | Python 2 | Python 3 |
---|---|---|
① | a_dictionary.has_key(‘PapayaWhip’) | ‘PapayaWhip’ in a_dictionary |
② | a_dictionary.has_key(x) or a_dictionary.has_key(y) | x in a_dictionary or y in a_dictionary |
③ | a_dictionary.has_key(x or y) | (x or y) in a_dictionary |
④ | a_dictionary.has_key(x + y) | (x + y) in a_dictionary |
⑤ | x + a_dictionary.has_key(y) | x + (y in a_dictionary) |
1, самая простая форма. 2, оператор or имеет меньший приоритет, чем оператор in, поэтому здесь не нужно добавлять скобки. 3, с другой стороны, по той же причине приоритет or ниже, чем in, здесь нужно добавить скобки。(Примечание: здесь код полностью отличается от предыдущего.Питон будет сначала интерпретировать x or y, получив результат x (((если x в контексте Бура является истинным) или y。 Затем Python проверяет, является ли этот результат a_(Одна клавиша в словарь. 4, оператор in имеет меньший приоритет, чем оператор +, поэтому эта форма в коде технически не требует скобки, но 2to3 все равно добавляется. 5. Эта форма обязательно должна быть в скобках, потому что in имеет меньший приоритет, чем +。
В Python 2 многие методы словарного класса возвращают значения в виде списков. Наиболее часто используемые методы включают в себя ключи, элементы и значения. В Python 3 все эти методы возвращают значения в виде динамического вида. В некоторых контекстах это изменение не имеет никакого влияния.
Notes | Python 2 | Python 3 |
---|---|---|
① | a_dictionary.keys() | list(a_dictionary.keys()) |
② | a_dictionary.items() | list(a_dictionary.items()) |
③ | a_dictionary.iterkeys() | iter(a_dictionary.keys()) |
④ | [i for iin a_dictionary.iterkeys()] | [i for iin a_dictionary.keys()] |
⑤ | min(a_dictionary.keys()) | no change |
С Python 2 по Python 3 некоторые модули стандартной кури были переименованы. Некоторые взаимосвязанные модули также были объединены или реорганизованы, чтобы сделать эту связь более логичной.
Notes | Python 2 | Python 3 |
---|---|---|
① | import httplib | import http.client |
② | import Cookie | import http.cookies |
③ | import cookielib | import http.cookiejar |
④ | import BaseHTTPServer import SimpleHTTPServer import CGIHttpServer |
import http.server |
Модуль http.client реализует базовую библиотеку, которую можно использовать для запроса HTTP-ресурсов и анализа HTTP-ответов. Модуль http.cookies предоставляет Python-интерфейс для получения файлов cookie, отправленных через HTTP-header Set-Cookie Популярные браузеры сохраняют куки на диске в виде файлов, которые могут быть обработаны модулем http.cookiejar. Модуль http.server реализует базовый HTTP-сервер
Notes | Python 2 | Python 3 |
---|---|---|
① | import urllib | import urllib.request urllib.parse,urllib.error |
② | import urllib2 | import urllib.request urllib.error |
③ | import urlparse | import urllib.parse |
④ | import robotparser | import urllib.robotparser |
⑤ | from urllib import FancyURLopener from urllib import urlencode |
from urllib.request import FancyURLopener from urllib.parse import urlencode |
⑥ | from urllib2 import Request from urllib2 import HTTPError |
from urllib.request import Request from urllib.error import HTTPError |
Раньше в модуле urllib в Python 2 имелись различные функции, включая urlopen () для извлечения данных, а также полезные для разделения URL-адресов на его составные части - функции splittype () (), splithost () (), и splituser () (). В новом пакете urllib эти функции были организованы более логически. 2to3 будет изменять вызовы этих функций, чтобы адаптироваться к новой схеме наименования. В Python 3 предыдущие модули urllib2 были объединены в пакет urllib. В то же время, все ваши любимые вещи из urllib2 будут появляться в модулях urllib в Python 3, например, build_opener (), Request object (), HTTPBasicAuthHandler (), и friends (). Модуль urllib.parse в Python 3 содержит все функции разбора модуля urlparse в Python 2. Модуль urllib.robotparse анализирует файл robots.txt. Класс FancyURLopener, который обрабатывает HTTP-перенаправления и другие коды состояния, остается в модуле urllib.request в Python 3. Функция ≠ urlencode ((() была перенесена в urllib.parse. Объект Request остается в urllib.request, но такие константы, как HTTPError, были перенесены в urllib.error. Я упоминал, что 2to3 также переписывает ваши функции? Например, если вы импортируете в Python 2 модуль urllib и вызываете urllib.urlopen () для получения данных, то 2to3 одновременно изменяет import и function calls.
Notes | Python 2 | Python 3 |
---|---|---|
① | import urllib print urllib.urlopen(’http://diveintopython3.org/‘).read() | import urllib.request, urllib.parse, urllib.error print(urllib.request.urlopen(’http://diveintopython3.org/‘).read()) |
Notes | Python 2 | Python 3 |
---|---|---|
① | import dbm | import dbm.ndbm |
② | import gdbm | import dbm.gnu |
③ | import dbhash | import dbm.bsd |
④ | import dumbdbm | import dbm.dumb |
⑤ | import anydbm import whichdb |
import dbm |
Notes | Python 2 | Python 3 |
---|---|---|
① | import xmlrpclib | import xmlrpc.client |
② | import DocXMLRPCServer import SimpleXMLRPCServer |
import xmlrpc.server |
Notes | Python 2 | Python 3 |
---|---|---|
① | try: import cStringIO as StringIO except ImportError: import StringIO |
import io |
② | try: import cPickle as pickle except ImportError: import pickle |
import pickle |
③ | import _builtin_ | import builtins |
④ | import copy_reg | import copyreg |
⑤ | import Queue | import queue |
⑥ | import SocketServer | import socketserver |
⑦ | import ConfigParser | import configparser |
⑧ | import repr | import reprlib |
⑨ | import commands | import subprocess |
Пакет - это единое целое, состоящее из группы взаимосвязанных модулей. В Python 2 для взаимной ссылки на модули одного и того же пакета вы используете import foo или from foo import Bar. Интерпретатор Python 2 сначала ищетfoo.py в текущем каталоге, а затем ищет в поисковом пути Python ((sys.path). В Python 3 процесс немного отличается.
Предположим, у вас есть несколько файлов в одном каталоге:
chardet/ | +–init.py | +–constants.py | +–mbcharsetprober.py | +–universaldetector.py
Предположим, что universaldetector.py требует импортировать constants.py, а также требует импортировать класс mbcharsetprober.py. Что бы вы сделали?
Notes | Python 2 | Python 3 |
---|---|---|
① | import constants | from .import constants |
② | from mbcharsetprober import MultiByteCharSetProber | from .mbcharsetprober import MultiByteCharsetProber |
Когда вам нужно импортировать целый модуль из другого места в пакете, используйте новую синтаксию from .import. Здесь символ (((.) обозначает относительный путь между текущим файлом (universaldetector.py) и файлом, который вы хотите импортировать (constants.py). В этом примере эти два файла находятся в одной каталоге, поэтому используется один символ. Вы также можете импортировать из родительского каталога (from .. import anothermodule) или из подкаталога. 2. Чтобы импортировать конкретный класс или функцию из других модулей непосредственно в именное пространство вашего модуля, добавьте относительный путь к имени модуля, который требует импорта, и удалите последнюю скобку ((slash)). В этом примере, mbcharsetprober.py находится в одном каталоге с universaldetector.py, поэтому относительный путь называется цифрой. Вы также можете импортировать из родительского каталога ((from .. import anothermodule) или из подкаталога.
В Python 2 итератор имеет метод next () для возвращения следующего элемента в последовательности. В Python 3 это также работает, но теперь есть новая глобальная функция next (), которая использует итератор в качестве параметра.
Notes | Python 2 | Python 3 |
---|---|---|
① | anIterator.next() | next(anIterator) |
② | a_function_that_returns_an_iterator().next() | next(a_function_that_returns_an_iterator()) |
|③|class A:
def next(self):
pass|class A:
def next(self):
pass|
|④|class A:
def next(self, x, y):
pass|no change |
|⑤|next = 42
for an_iterator in a_sequence_of_iterators:
an_iterator.next()|next = 42
for an_iterator in a_sequence_of_iterators:
an_iterator.next() |
1, самый простой пример, вы больше не вызываете метод next (() для итера, теперь вы передаете сам итера в качестве параметров глобальной функции next (()) [2].
2) Если вы получили функцию, которая возвращает значение, то она должна быть функцией индексатора, вызвать эту функцию и передать результат в качестве параметров функции next ((((скрипт 2to3 достаточно умный, чтобы правильно выполнить это преобразование)))
В-третьих, если вы предположительно определили свой собственный класс, а затем использовали его в качестве итератора, то в Python 3 вы можете определить специальные методы, которые вы можете использовать для определения своего собственного класса.next() для достижения.
Если в классе, который вы определили, есть next () и он использует один или несколько параметров, то при выполнении 2to3 он не будет подвижен. Этот класс не может использоваться в качестве итератора, потому что его метод next () имеет параметры.
5, это немного сложно. Если вы случайно имеете локальную переменную, называемую next, в Python 3 она имеет более высокий приоритет, чем глобальная функция next (((). В этом случае вам нужно вызвать специальные методы итератораnext() для получения следующего элемента в последовательности。(или, вы также можете перестроить код так, чтобы имя этой локальной переменной не было next, но 2to3 не сделает этого для вас。)
В Python 2 метод filter() возвращает список, полученный с помощью функции, которая возвращает значение True или False для проверки каждого элемента в последовательности. В Python 3 функция filter() возвращает итератор, а не список.
Notes | Python 2 | Python 3 |
---|---|---|
① | filter(a_function, a_sequence) | list(filter(a_function, a_sequence)) |
② | list(filter(a_function, a_sequence)) | no change |
③ | filter(None, a_sequence) | [i for iin a_sequence if i] |
④ | for i in filter(None, a_sequence): | no change |
⑤ | [i for iin filter(a_function, a_sequence)] | no change |
1, в самом простом случае, 2to3 использует функцию list () для упаковки фильтра () и пересекает ее параметры, а затем возвращает список. Однако, если вызывание filter() уже упаковано в пакет list(), 2to3 не будет обрабатывать его, так как в этом случае не имеет значения, является ли возвращаемое значение filter() итератором. Для обработки специфического синтаксиса filter ((None, …) 2to3 преобразует этот вызов из грамматического эквивалента в список анализа. 4. Поскольку цикл for проходит через всю последовательность, нет необходимости в дальнейших изменениях. 5. Как и выше, не требуется никаких изменений, поскольку анализ списка проходит через всю последовательность, и даже если filter () возвращает итератор, он будет работать так же, как и предыдущий filter () возвращал список.
Как и в случае с filter ((), функция map (() теперь возвращает итератор。(В Python 2 она возвращает список。)
Notes | Python 2 | Python 3 |
---|---|---|
① | map(a_function,‘PapayaWhip’) | list(map(a_function,‘PapayaWhip’)) |
② | map(None,‘PapayaWhip’) | list(‘PapayaWhip’) |
③ | map(lambda x: x+1,range(42)) | [x+1for x in range(42)] |
④ | for i in map(a_function, a_sequence): | no change |
⑤ | [i for iin map(a_function,a_sequence)] | no change |
1, аналогично обработке filter ((), в простейшем случае 2to3 использует функцию list (() для упаковки вызова map ((). Для специального синтаксиса map ((None, …) аналогично filter ((None, …) 2to3 преобразует его в эквивалентный вызов, использующий list ((). Если первый аргумент map () - это функция lambda, то 2to3 преобразует её в эквивалентный список. 4. Для циклов for, которые проходят через всю последовательность, изменения не требуются. 5. Опять же, здесь нет необходимости в изменениях, так как список будет проходить через всю последовательность, и даже если возвращенное значение map () является итератором, а не списком, оно будет работать нормально.
В Python 3 функция reduce ((() была удалена из глобального пространства имен и теперь помещена в модуль fucntools。
Notes | Python 2 | Python 3 |
---|---|---|
① | reduce(a, b, c) | from functools import reduce reduce(a, b, c) |
В Python 2 есть глобальная функция apply (), которая использует функцию f и список.[a, b, c] возвращает в качестве аргумента значение f ((a, b, c) . Вы также можете добавить звездочку (() перед списком, вызвав эту функцию напрямую.*В Python 3 функция apply ((() больше не существует; нужно использовать маркировку звездочкой.
Notes | Python 2 | Python 3 |
---|---|---|
① | apply(a_function, a_list_of_args) | a_function(*a_list_of_args) |
② | apply(a_function, a_list_of_args, a_dictionary_of_named_args) | a_function(*a_list_of_args,**a_dictionary_of_named_args) |
③ | apply(a_function, a_list_of_args+ z) | a_function(*a_list_of_args+ z) |
④ | apply(aModule.a_function, a_list_of_args) | aModule.a_function(*a_list_of_args) |
1, простейшая форма, которая может быть использована в списке параметров, как[a, b, c]), добавить звездочку, чтобы вызвать функцию。 Это эквивалентно функции apply ((() в Python 2. В Python 2 функция apply (() может иметь три параметра: функцию, список параметров и словарь именных аргументов. В Python 3 вы можете добавить звездочку (() перед списком параметров.), добавить две звездочки перед именными параметрами словаря ((**В этом случае мы не сможем достичь того же эффекта. 3, оператор + используется здесь как функция соединения списка, и имеет более высокий приоритет, чем оператор, поэтому нет необходимости добавлять дополнительные скобки вокруг a_list_of_args + z. 4, 2to3 скрипты достаточно умны, чтобы конвертировать сложные призывы apply (), включая призывы к функциям в модуле импорта.
В Python 2 вы можете использовать функцию intern (() для определения её действия на строке, чтобы достичь оптимизации производительности. В Python 3 функция intern (() была перенесена в модуль sys.
Notes | Python 2 | Python 3 |
---|---|---|
① | intern(aString) | sys.intern(aString) |
Так же, как в Python 3 print-соглашение превращается в функцию, так и в exec-соглашении. функцию .exec () использует в качестве параметров строку, содержащую любой код Python, и затем выполняет ее, как в случае с исполнением предложения или выражения.
Notes | Python 2 | Python 3 |
---|
|①|exec codeString|exec(codeString) |②|exec codeString in a_global_namespace|exec(codeString, a_global_namespace)| |③|exec codeString in a_global_namespace, a_local_namespace|exec(codeString, a_global_namespace,a_local_namespace)| 1, в своей простейшей форме, потому что exec (() теперь является функцией, а не выражением, 2to3 окружает этот код в виде строки скобками. 2. В Python 2 exec-заявление может указывать пространство имен, и код будет выполняться в этом частном пространстве, состоящем из глобальных объектов. Так же работает Python 3; вам просто нужно передать это пространство имен в качестве второго параметра функции exec (). 3. Еще более удивительным является то, что в Python 2 в exec-заказе также может быть указано местное пространство имен (например, переменная, объявленная в функции). В Python 3 функция exec () также имеет такую функцию.
В отличие от exec, который использует строки, execfile использует файлы. В Python 3, execfile был удален. Если вы действительно хотите выполнить код Python в файле, но вы не хотите импортировать его, вы можете открыть его, прочитать его содержимое, а затем вызвать функцию compile (всемирная функция), чтобы заставить интерпретатор Python компилировать код, а затем вызвать новую функцию exec (всемирная функция).
Notes | Python 2 | Python 3 |
---|---|---|
① | execfile(‘a_filename’) | exec(compile(open(‘a_filename’).read(),‘a_filename’,‘exec’)) |
В Python 2 для получения произвольного объекта в строке есть способ упаковать объект в обратную ссылку ((, напримерx
В Python 3 эта способность сохранилась, но вы больше не можете использовать обратную ссылку для получения этой строки. Вам нужно использовать глобальную функцию repr ((() }}.
Notes | Python 2 | Python 3 |
---|---|---|
① | `x` | repr(x) |
② | `‘PapayaWhip’ + `2`` | repr(‘PapayaWhip’+ repr(2)) |
С Python 2 в Python 3 немного изменился синтаксис, используемый для захвата аномалий.
Notes | Python 2 | Python 3 |
---|---|---|
① | try: import mymodule except ImportError, e pass |
try: import mymodule except ImportError as e: pass |
② | try: import mymodule except (RuntimeError, ImportError), e pass |
try: import mymodule except (RuntimeError, ImportError) as e: pass |
③ | try: import mymodule except ImportError: pass |
no change |
④ | try: import mymodule except: pass |
no change |
1, по сравнению с добавлением запятой после необычного типа в Python 2, Python 3 использует новый ключевой словарь, as。 2. Ключевое слово as также может быть использовано при одновременном обнаружении нескольких типов аномалий. Если вы поймали исключение, но не обращали внимания на сам объект исключения, то синтаксис Python 2 и Python 3 одинаковый. 4 , Аналогично, если вы используете метод страховки ((fallback) для захвата всех исключений, синтаксис Python 2 и Python 3 одинаковый. 5. При импорте модулей (или в большинстве других случаев) вам абсолютно не следует использовать этот метод (см. вышеупомянутый фаллбэк). В противном случае программа может поймать такие исключения, как KeyboardInterrupt (если пользователь прервет программу, нажав Ctrl-C), что затрудняет дебютирование.
В Python 3 существуют небольшие изменения в синтаксисе, позволяющих выбрасывать пользовательские исключения.
Notes | Python 2 | Python 3 |
---|---|---|
① | raise MyException | unchanged |
② | raise MyException,‘error message’ | raise MyException(‘error message’) |
③ | raise MyException,‘error message’, a_traceback | raise MyException(‘errormessage’).with_traceback(a_traceback) |
④ | raise ‘error message’ | unsupported |
В Python 2 в генераторе есть метод throw (). вызов a_generator.throw () выводит исключение, когда генератор приостанавливается, а затем возвращает следующее значение, полученное функцией генератора. В Python 3 эта функция все еще доступна, но немного по-другому в синтаксическом плане.
Notes | Python 2 | Python 3 |
---|---|---|
① | a_generator.throw(MyException) | no change |
② | a_generator.throw(MyException,‘error message’) | a_generator.throw(MyException(‘error message’)) |
③ | a_generator.throw(‘error message’) | unsupported |
В Python 2 есть два способа получить число в пределах определенного диапазона: range (), который возвращает список, и range (), который возвращает итератор. В Python 3 range (), возвращающий итератор, и xrange (), который больше не существует.
Notes | Python 2 | Python 3 |
---|---|---|
① | xrange(10) | range(10) |
② | a_list = range(10) | a_list = list(range(10)) |
③ | [i for iin xrange(10)] | [i for iin range(10)] |
④ | for i in range(10): | no change |
⑤ | sum(range(10)) | no change |
1, в самом простом случае 2to3 просто преобразует xrange () в range () [2]. 2, если в вашем коде Python 2 используется range (), 2to3 не знает, нужен ли вам список, или же работает итератор. В качестве меры предосторожности 2to3 может ошибиться и использовать list (), чтобы принудительно преобразовать возвращаемое значение range (). Если в списке есть функция xrange (), то нет необходимости преобразовывать ее в список, поскольку списочный анализ действует так же, как и для итератора. 4 , аналогично, цикл for может также действовать на итераторы, так что здесь ничего не меняется. Функция sum ((() действует на итератор, поэтому 2to3 здесь не изменяется. Так же, как вернется значение как вид ((view), а не как список, это также применимо к min (((), max (((), sum (((), list (((), tuple (((), set (((), sorted (((), any (((), all ((().
В Python 2 есть две глобальные функции, которые используются для запроса пользователя на вводе в командной строке. Первая называется input(), которая ждет, пока пользователь введет Python-выражение (((, а затем вернет результат). Вторая называется raw_input (((), и то, что пользователь вводит, то и возвращает.
Notes | Python 2 | Python 3 |
---|---|---|
① | raw_input() | input() |
② | raw_input(‘prompt’) | input(‘prompt’) |
③ | input() | eval(input()) |
1, в простейшей форме, raw_input (() заменен на input (()) [2]. 2, в Python 2 функция raw_input (() может задавать указатель в качестве параметра. Эта функция сохранена в Python 3. 3, если вы действительно хотите попросить пользователя ввести Python-выражение и рассчитать результат, вы можете вызвать функцию input() и передать возвращаемое значение eval()。
В Python 2 код функции может получить доступ к специальным свойствам самой функции. В Python 3 эти специальные свойства были переименованы для согласованности.
Notes | Python 2 | Python 3 |
---|---|---|
① | a_function.func_name | a_function._name_ |
② | a_function.func_doc | a_function._doc_ |
③ | a_function.func_defaults | a_function._defaults_ |
④ | a_function.func_dict | a_function._dict_ |
⑤ | a_function.func_closure | a_function._closure_ |
⑥ | a_function.func_globals | a_function._globals_ |
⑦ | a_function.func_code | a_function._code_ |
1、name атрибут ((originalfunc_name) содержит имя функции。 2、doc атрибут ((originalfuncdoc) содержит строку документа, которую вы определили в исходном коде функции ((docstring)) 3、defaults атрибут ((originalfunc_defaults) - это матрица, хранящая параметры по умолчанию. 4、dict атрибут ((originalfunc_dict) - пространство имен, поддерживающее произвольные атрибуты функций. 5、closureattribute ((originalfunc_closure) - это подгруппа, состоящая из объектов cell, которая содержит связь функции со свободной переменной ((free variable)). 6、globals атрибут ((originalfunc_globals) - это ссылка на модуль глобального именного пространства, в котором сама функция определена. 7、code атрибут ((originalfunc_code) - это объект кода, который представляет собой компилированное функциональное тело.
В Python 2 файловые объекты имеют метод xreadlines (), который возвращает итератор, который зачитывает одну строку файла за раз. Это особенно полезно в цикле for. Фактически, более поздние версии Python 2 добавляют такую функцию к самим файловым объектам.
В Python 3 метод xreadlines () больше не используется. 2to3 может решить простые ситуации, но некоторые крайние случаи требуют ручного вмешательства.
Notes | Python 2 | Python 3 |
---|---|---|
① | for line in a_file.xreadlines(): | for line in a_file: |
② | for line in a_file.xreadlines(5): |