Python 3.9’daki Yenilikler

Editör:

Łukasz Langa

This article explains the new features in Python 3.9, compared to 3.8. Python 3.9 was released on October 5, 2020. For full details, see the changelog.

Ayrıca bakınız

PEP 596 - Python 3.9 Yayınlama Takvimi

Özet – Sürümün öne çıkanları

Yeni sözdizimi özellikleri:

  • PEP 584 , dict için birleşim işleçleri eklendi;

  • PEP 585 , standart koleksiyonlarda tür ipuçlama (type hinting) jenerikleri;

  • PEP 614 , dekoratörlerde gramer kısıtlamaları gevşetildi.

Yeni gömülü özellikler:

  • PEP 616 , önekleri ve sonekleri kaldırmak için dize yöntemleri.

Standart kütüphanedeki yeni özellikler:

  • PEP 593 esnek fonksiyon ve değişken açıklamaları;

  • Yarışlar ve sinyaller olmadan süreç yönetimine izin veren os.pidfd_open() eklendi.

Tercüman geliştirmeleri:

  • PEP 573, C uzantı türlerinin yöntemlerinden modül durumuna hızlı erişim;

  • PEP 617, CPython artık PEG tabanlı yeni bir çözümleyici kullanıyor;

  • bir dizi python gömülüleri (range, tuple, set, frozenset, list, dict) PEP 590 vectorcall kullanılarak hızlandırıldı;

  • çöp toplama, dirilen nesnelerde engellemez;

  • a number of Python modules (_abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, math, operator, resource, time, _weakref) now use multiphase initialization as defined by PEP 489;

  • a number of standard library modules (audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios, zlib) are now using the stable ABI defined by PEP 384.

Standart kütüphanedeki yeni özellikler:

  • PEP 615, IANA Zaman Dilimi Veritabanı artık zoneinfo modülündeki standart kitaplıkta mevcuttur;

  • topolojik türde bir grafik uygulaması artık yeni graphlib modülünde sağlanmaktadır.

Yayın süreci değişiklikleri:

  • PEP 602, CPython yıllık bir yayın döngüsü benimser.

Kodunuzda DeprecationWarning olup olmadığını kontrol etmelisiniz

Python 2.7 hala desteklendiğinde, Python 2.7 ile geriye dönük uyumluluk için Python 3’teki birçok işlevsellik korunmuştur. Python 2 desteğinin sona ermesiyle bu geriye dönük uyumluluk katmanları kaldırıldı veya yakında kaldırılacak. Çoğu, birkaç yıl boyunca bir DeprecationWarning uyarısı yayınladı. Örneğin, collections.abc.Mapping yerine collections.Mappin kullanmak, 2012’de yayınlanan Python 3.3’ten bu yana bir DeprecationWarning yayar.

DeprecationWarning ve PendingDeprecationWarning öğelerini görmek için -W default komut satırı seçeneğiyle veya bunları hata olarak değerlendirmek için -W error ile uygulamanızı test edin. Uyarı Filtresi, üçüncü taraf kodundan gelen uyarıları yok saymak için kullanılabilir.

Python 3.9, Python proje yöneticilerine Python 2 desteğinin kaldırılmasını organize etmeleri ve Python 3.9 için destek eklemeleri için daha fazla zaman vermek üzere Python 2 geriye dönük uyumluluk katmanlarını sağlayan son sürümdür.

collections modülünde Soyut Temel Sınıflar için takma adlar, collections.abc.Mapping için collections.Mapping takma adı gibi, geriye dönük uyumluluk için son bir sürüm için saklanır. Python 3.10’dan kaldırılacaklar.

Daha genel olarak, kodunuzu bir sonraki Python sürümüyle uyumlu hale getirmek için hazırlamanıza yardımcı olan Python Development Mode testlerinizi çalıştırmayı deneyin.

Not: Python’un bu sürümünde önceden var olan bazı kullanımdan kaldırmalar da kaldırılmıştır. Kaldırılanlar bölümüne bakınız.

Yeni Özellikler

Sözlük Birleştirme ve Güncelleme Operatörleri

Gömülü dict sınıfına birleştirme (|) ve güncelleme (|=) operatörleri eklendi. Bunlar, sözlükleri birleştirmenin mevcut dict.update ve {**d1, **d2} yöntemlerini tamamlar.

Örnek:

>>> x = {"key1": "value1 from x", "key2": "value2 from x"}
>>> y = {"key2": "value2 from y", "key3": "value3 from y"}
>>> x | y
{'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}
>>> y | x
{'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}

Tam açıklama için PEP 584 sayfasına bakınız. (Brandt Bucher tarafından bpo-36144 ile katkıda bulunulmuştur)

Önekleri ve Sonekleri Kaldırmak için Yeni Dize Yöntemleri

str.removeprefix(prefix) ve str.removesuffix(suffix), gereksiz bir öneki veya bir soneki bir dizeden kolayca kaldırmak için eklenmiştir. Karşılık gelen bytes, bytearray ve collections.UserString yöntemleri de eklenmiştir. Tam açıklama için PEP 616 ‘ya bakın. (Dennis Sweeney tarafından bpo-39939 ‘da katılmıştır.)

Standart Koleksiyonlardaki Tür Dayatma Jenerikleri

Yazım ek açıklamalarında, artık typing ‘den karşılık gelen büyük harfli türleri (örnek olarak List veya Dict) içe aktarmak yerine list ve dict gibi yerleşik koleksiyon türlerini genel türler olarak kullanabilirsiniz. Standart kitaplıktaki diğer bazı türler de artık geneldir, örneğin queue.Queue.

Örnek:

def greet_all(names: list[str]) -> None:
    for name in names:
        print("Hello", name)

Daha fazla ayrıntı için bkz. PEP 585. (Guido van Rossum, Ethan Smith ve Batuhan Taşkaya’nın katkılarıyla bpo-39481.)

Yeni Ayrıştırıcı

Python 3.9, LL(1) yerine PEG tabanlı yeni bir ayrıştırıcı kullanır. Yeni ayrıştırıcının performansı kabaca eski ayrıştırıcınınkiyle karşılaştırılabilir, ancak iş yeni dil özellikleri tasarlamaya geldiğinde PEG biçimciliği LL(1)’den daha esnektir. Bu esnekliği Python 3.10 ve sonrasında kullanmaya başlayacağız.

ast modülü yeni ayrıştırıcıyı kullanır ve eski ayrıştırıcı ile aynı AST’yi üretir.

In Python 3.10, the old parser will be deleted and so will all functionality that depends on it (primarily the parser module, which has long been deprecated). In Python 3.9 only, you can switch back to the LL(1) parser using a command line switch (-X oldparser) or an environment variable (PYTHONOLDPARSER=1).

Daha fazla ayrıntı için bkz. PEP 617. ( bpo-40334 içinde Guido van Rossum, Pablo Galindo ve Lysandros Nikolaou tarafından katılmıştır.)

Başka Dil Değişiklikleri

  • __import__() artık ImportError değerini, eskiden göreli bir içe aktarma üst düzey paketini geçtiğinde oluşan ValueError yerine yükseltiyor. ( bpo-37444 içinde Ngalim Siregar tarafından katılmıştır.)

  • Python artık komut satırında belirtilen betik dosya adının mutlak yolunu alıyor (örn: python3 script.py): __main__ modülünün __file__ özniteliği, mutlak bir yol haline geldi. göreceli bir yoldan daha. Bu yollar, geçerli dizin os.chdir() tarafından değiştirildikten sonra artık geçerliliğini koruyor. Bir yan etki olarak geri izleme, bu durumda __main__ modül çerçeveleri için mutlak yolu da görüntüler. (Victor Stinner tarafından bpo-20443 ‘de katılmıştır.)

  • Python Development Mode ve debug build içinde, encoding ve errors argümanları artık dize kodlama ve kod çözme işlemleri için kontrol ediliyor. Örnekler: open(), str.encode() ve bytes.decode().

    Varsayılan olarak, en iyi performans için errors bağımsız değişkeni yalnızca ilk kodlama/kod çözme hatasında kontrol edilir ve encoding bağımsız değişkeni bazen boş dizeler için yoksayılır. (Victor Stinner tarafından bpo-37388 ‘de katılmıştır.)

  • "".replace("", s, n) artık sıfır olmayan tüm n için boş bir dize yerine s döndürür. Artık "".replace("", s) ile tutarlıdır. bytes ve bytearray nesneleri için benzer değişiklikler vardır. (Serhiy Storchaka tarafından bpo-28029 ‘da katılmıştır.)

  • Artık herhangi bir geçerli ifade dekoratör olarak kullanılabilir. Önceden, gramer çok daha kısıtlayıcıydı. Ayrıntılar için bkz. PEP 614. (Brandt Bucher tarafından bpo-39702 ‘de katılmıştır.)

  • typing modülü için yardım iyileştirildi. doküman dizeleri artık tüm özel formlar ve özel genel takma adlar (Union ve List gibi) için gösteriliyor. help() öğesini List[int] gibi genel takma adla kullanmak, karşılık gelen somut tür için yardımı gösterir (bu durumda list). ( bpo-40257 içinde Serhiy Storchaka tarafından katılmıştır.)

  • aclose() / asend() / athrow() ‘nın paralel çalışması artık yasaklanmıştır ve ag_running artık zaman uyumsuz oluşturucunun gerçek çalışma durumunu yansıtmaktadır. (Yury Selivanov tarafından bpo-30773 ‘de katılmıştır.)

  • __iter__ yöntemini çağırmadaki beklenmeyen hatalar artık in operatöründe ve operator modülünün contains(), indexOf() ve countOf() fonksiyonlarında TypeError tarafından maskelenmiyor. ( bpo-40824 içinde Serhiy Storchaka tarafından katılmıştır.)

  • Parantezsiz lambda ifadeleri artık kavramalarda ve üreteç ifadelerinde bir if yan tümcesinde ifade parçası olamaz. Ayrıntılar için bpo-41848 ve bpo-43755 ‘e bakın.

Yeni Modüller

zoneinfo

zoneinfo modülü, standart kitaplığa IANA saat dilimi veritabanı desteği getirir. Sistemin saat dilimi verileri tarafından desteklenen somut bir datetime.tzinfo uygulaması olan zoneinfo.ZoneInfo ekler.

Örnek:

>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta

>>> # Daylight saving time
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(dt)
2020-10-31 12:00:00-07:00
>>> dt.tzname()
'PDT'

>>> # Standard time
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00
>>> print(dt.tzname())
PST

As a fall-back source of data for platforms that don’t ship the IANA database, the tzdata module was released as a first-party package – distributed via PyPI and maintained by the CPython core team.

Ayrıca bakınız

PEP 615 – Standart Kitaplıkta IANA Saat Dilimi Veritabanı Desteği

Paul Ganssle tarafından yazılan ve uygulanan PEP

graphlib

Grafiklerin topolojik sıralamasını gerçekleştirmek üzere işlevsellik sunmak için graphlib.TopologicalSorter sınıfını içeren graphlib adlı yeni bir modül eklendi. ( bpo-17005 içinde Pablo Galindo, Tim Peters ve Larry Hastings’in katkılarıyla.)

Geliştirilen Modüller

ast

dump() dosyasına indent seçeneği eklendi, bu da çok satırlı girintili bir çıktı üretmesini sağlar. ( bpo-37995 içinde Serhiy Storchaka tarafından katılmıştır.)

ast modülüne, bir ast.AST nesnesini ayrıştırmak ve ayrıştırıldığında eşdeğer bir ast.AST nesnesi üretecek kod içeren bir dize üretmek için kullanılabilen bir fonksiyon olarak ast.unparse() eklendi. ( bpo-38870 ‘de Pablo Galindo ve Batuhan Taskaya’nın katkısıyla.)

AST düğümlerine, o düğümü oluşturmak için kullanılan ASDL imzasını içeren doküman dizeleri eklendi. (Batuhan Taşkaya bpo-39638 ‘de katılmıştır.)

asyncio

Önemli güvenlik kaygıları nedeniyle, asyncio.loop.create_datagram_endpoint() ‘in reuse_address parametresi artık desteklenmemektedir. Bunun nedeni, UDP’deki SO_REUSEADDR soket seçeneğinin davranışıdır. Daha fazla ayrıntı için loop.create_datagram_endpoint() belgelerine bakın. (Kyle Stanley, Antoine Pitrou ve Yury Selivanov’un katkılarıyla bpo-37228.)

ThreadPoolExecutor üzerinde kapanışı bitirmeyi bekleyen varsayılan yürütücü için bir kapatma programlayan yeni bir coroutine shutdown_default_executor() eklendi. Ayrıca, asyncio.run() yeni coroutine kelimesini kullanacak şekilde güncellendi. (Kyle Stanley tarafından bpo-34037 ‘de katılmıştır.)

İşlem dosyası tanımlayıcılarını yoklayan, Linux’a özgü bir çocuk izleyici uygulaması olan asyncio.PidfdChildWatcher eklendi. (bpo-38692)

Yeni bir coroutine asyncio.to_thread() eklendi. Olay döngüsünü engellemekten kaçınmak için GÇ’ye bağlı işlevleri ayrı bir iş parçacığında çalıştırmak için kullanılır ve temel olarak run_in_executor() öğesinin doğrudan anahtar sözcük bağımsız değişkenlerini alabilen üst düzey bir sürümü olarak çalışır. ( bpo-32309 ‘da Kyle Stanley ve Yuri Selivanov tarafından katılmıştır.)

Bir zaman aşımı nedeniyle görevi iptal ederken, asyncio.wait_for() şimdi, pozitif zaman aşımlarında olduğu gibi timeout <= 0 olduğunda da iptalin tamamlanmasını bekleyecek. ( bpo-32751 ‘de Elvis Pranskevichus tarafından katılmıştır.)

asyncio now raises TypeError when calling incompatible methods with an ssl.SSLSocket socket. (Contributed by Ido Michael in bpo-37404.)

compileall

Yinelenen .pyc dosyaları için hardlink kullanma olanağı eklendi: hardlink_dupes parametresi ve –hardlink-dupes komut satırı seçeneği. (Lumír ‘Frenzy’ Balhar’ın bpo-40495 içinde katkısı.)

Ortaya çıkan .pyc dosyalarında yol işleme için yeni seçenekler eklendi: stripdir, prependdir, limit_sl_dest parametreleri ve -s, -p, -e komut satırı seçenekleri. Optimizasyon düzeyi seçeneğini birden çok kez belirleme olanağı eklendi. (Lumír ‘Frenzy’ Balhar’ın katkılarıyla bpo-38112.)

concurrent.futures

concurrent.futures.Executor.shutdown() öğesine, yürütücüyü kapatmadan önce tamamlanmalarını beklemek yerine çalışmaya başlamamış bekleyen tüm vadeli işlemleri iptal eden yeni bir cancel_futures parametresi eklendi. (Kyle Stanley tarafından bpo-39349 ‘da katılmıştır.)

ThreadPoolExecutor ve ProcessPoolExecutor ‘dan arka plan programı konuları kaldırıldı. Bu, alt yorumlayıcılarla uyumluluğu ve kapatma süreçlerinde öngörülebilirliği geliştirir. (Kyle Stanley tarafından bpo-39812 ‘de katılmıştır.)

ProcessPoolExecutor içindeki çalışanlar artık talep üzerine, yalnızca yeniden kullanılacak boş çalışan olmadığında ortaya çıkıyor. Bu, başlatma yükünü optimize eder ve boşta kalan çalışanlar için kaybedilen CPU süresini azaltır. (Kyle Stanley tarafından bpo-39207 ‘de katılmıştır.)

curses

curses.get_escdelay(), curses.set_escdelay(), curses.get_tabsize() ve curses.set_tabsize() işlevleri eklendi. (Anthony Sottile tarafından bpo-38312 ‘de katılmıştır.)

datetime

The isocalendar() of datetime.date and isocalendar() of datetime.datetime methods now returns a namedtuple() instead of a tuple. (Contributed by Donghee Na in bpo-24416.)

distutils

upload komutu artık SHA2-256 ve Blake2b-256 hash özetleri oluşturuyor. MD5 özetini engelleyen platformlarda MD5’i atlar. ( bpo-40698 içinde Christian Heimes tarafından katılmıştır.)

fcntl

Added constants F_OFD_GETLK, F_OFD_SETLK and F_OFD_SETLKW. (Contributed by Donghee Na in bpo-38602.)

ftplib

FTP and FTP_TLS now raise a ValueError if the given timeout for their constructor is zero to prevent the creation of a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)

gc

Çöp toplayıcı, bazı nesnelerin diriltildiği bir koleksiyon oluşturduğunda (sonlandırıcılar yürütüldükten sonra yalıtılmış döngülerin dışından erişilebilirler), hala erişilemeyen tüm nesnelerin toplanmasını engellemeyin. ( bpo-38379 ‘da Pablo Galindo ve Tim Peters tarafıdnan eklendi.)

Bir nesnenin çöp toplayıcı tarafından sonlandırılıp sonlandırılmadığını kontrol etmek için gc.is_finalized() adlı yeni bir işlev eklendi. (Pablo Galindo tarafından bpo-39322 ‘de katılmıştır.)

hashlib

hashlib modülü artık mevcut olduğunda OpenSSL’den SHA3 karmalarını ve SHAKE XOF’u kullanabilir. (Christian Heimes tarafından bpo-37630 ‘da katılmıştır.)

Yerleşik karma modüller, OpenSSL tabanlı uygulamanın kullanımını zorlamak için artık ./configure --without-builtin-hashlib-hashes ile devre dışı bırakılabilir veya e.g. ./configure --with-builtin-hashlib-hashes=sha3,blake2 ile seçici olarak etkinleştirilebilir. (Christian Heimes tarafından bpo-40479 ‘da katılmıştır)

http

HTTP status codes 103 EARLY_HINTS, 418 IM_A_TEAPOT and 425 TOO_EARLY are added to http.HTTPStatus. (Contributed by Donghee Na in bpo-39509 and Ross Rhodes in bpo-39507.)

IDLE ve idlelib

İmlecin yanıp sönmesini kapatmak için seçenek eklendi. ( bpo-4603 içinde Zackery Spytz tarafından katılmıştır.)

Escape tuşu artık IDLE tamamlama pencerelerini kapatıyor. ( bpo-38944 içinde Johnny Najera tarafından katılmıştır.)

Modül adı tamamlama listesine anahtar kelimeler eklendi. ( bpo-37765 içinde Terry J. Reedy tarafından katılmıştır.)

3.9 bakım sürümlerinde yenilikler

IDLE’yi başlatın sys.excepthook() (‘-n’ olmadan başlatıldığında). Kullanıcı kancaları daha önce yok sayılırdı. ( bpo-43008 ‘de Ken Hilton tarafından katılmıştır.)

Yukarıdaki değişiklikler 3.8 bakım sürümlerine geri aktarılmıştır.

Ayarlar iletişim kutusunu yeniden düzenleyin. Genel sekmesini Windows ve Kabuk/Ed sekmelerine ayırın. Yardım menüsünü genişleten yardım kaynaklarını Uzantılar sekmesine taşıyın. Yeni seçenekler için yer açın ve iletişim kutusunu kısaltın. İkincisi, iletişim kutusunu küçük ekranlara daha iyi sığdırır. ( bpo-40468 içinde Terry Jan Reedy tarafından katılmıştır.) Girinti alanı ayarını Yazı Tipi sekmesinden yeni Windows sekmesine taşıyın. (Mark Roseman ve Terry Jan Reedy tarafından bpo-33962 ‘de katılmıştır.)

.pyi dosyalarına vurgulama sözdizimi uygulayın. ( bpo-45447 içinde Alex Waygood ve Terry Jan Reedy tarafından katılmıştır.)

imaplib

IMAP4 and IMAP4_SSL now have an optional timeout parameter for their constructors. Also, the open() method now has an optional timeout parameter with this change. The overridden methods of IMAP4_SSL and IMAP4_stream were applied to this change. (Contributed by Donghee Na in bpo-38615.)

imaplib.IMAP4.unselect() is added. imaplib.IMAP4.unselect() frees server’s resources associated with the selected mailbox and returns the server to the authenticated state. This command performs the same actions as imaplib.IMAP4.close(), except that no messages are permanently removed from the currently selected mailbox. (Contributed by Donghee Na in bpo-40375.)

importlib

İçe aktarma ifadeleriyle tutarlılığı artırmak için importlib.util.resolve_name() artık geçersiz göreli içe aktarma girişimleri için ValueError yerine ImportError değerini yükseltiyor. ( bpo-37444 içinde Ngalim Siregar tarafından katılmıştır.)

Değişmez modül nesnelerini yayınlayan içe aktarma yükleyicileri artık bağımsız modüllere ek olarak değişmez paketleri de yayınlayabilir. (Dino Viehland tarafından bpo-39336 ‘da katılmıştır.)

Paket verilerindeki alt dizinleri destekleyen, importlib_resources sürüm 1.5’te backport ile eşleşen importlib.resources.files() işlevi eklendi. (Jason R. Coombs’un bpo-39791 ‘deki katkılarıyla.)

importlib_metadata sürüm 1.6.1’den importlib.metadata yenilendi.

inspect

inspect.BoundArguments.arguments, OrderedDict yerine normal dict olarak değiştirildi. ( bpo-36350 ve bpo-39775 içinde Inada Naoki tarafından katılmıştır.)

ipaddress

ipadresi artık IPv6 Kapsamlı Adresleri (%<scope_id> sonekine sahip IPv6 adresi) desteklemektedir.

Kapsamlı IPv6 adresleri ipaddress.IPv6Address kullanılarak ayrıştırılabilir. Varsa, kapsam bölgesi kimliği scope_id özelliği aracılığıyla kullanılabilir. (Oleksandr Pavliuk tarafından bpo-34788 ‘de katılmıştır.)

Python 3.9.5’ten itibaren ipaddress modülü artık IPv4 adres dizelerinde baştaki sıfırları kabul etmemektedir. ( bpo-36384 içinde Christian Heimes tarafından katılmıştır).

math

Birden çok argümanı işlemek için math.gcd() işlevi genişletildi. Önceden, yalnızca iki argümanı destekliyordu. ( bpo-39648 içinde Serhiy Storchaka tarafından katılmıştır.)

math.lcm() eklendi: belirtilen bağımsız değişkenlerin en küçük ortak katını döndürür. ( bpo-39479 ve bpo-39648 ‘de Mark Dickinson, Ananthakrishnan ve Serhiy Storchaka’nın katkılarıyla.)

Eklenen math.nextafter(): x’ten sonra y’ye doğru bir sonraki kayan nokta değerini döndürür. (Victor Stinner tarafından bpo-39288 ‘de katılmıştır.)

Eklenen math.ulp(): bir kayan noktanın en önemsiz bitinin değerini döndürür. (Victor Stinner tarafından bpo-39310 ‘da katılmıştır.)

multiprocessing

multiprocessing.SimpleQueue sınıfı, kuyruğu açıkça kapatmak için yeni bir close() yöntemine sahiptir. (Victor Stinner tarafından bpo-30966 ‘da katılmıştır.)

nntplib

NNTP and NNTP_SSL now raise a ValueError if the given timeout for their constructor is zero to prevent the creation of a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)

os

Added CLD_KILLED and CLD_STOPPED for si_code. (Contributed by Donghee Na in bpo-38493.)

Exposed the Linux-specific os.pidfd_open() (bpo-38692) and os.P_PIDFD (bpo-38713) for process management with file descriptors.

os.unsetenv() işlevi artık Windows’ta da mevcuttur. (Victor Stinner tarafından bpo-39413 ‘de katılmıştır.)

os.putenv() ve os.unsetenv() fonksiyonları artık her zaman kullanılabilir. (Victor Stinner tarafından bpo-39395 ‘de katılmıştır.)

os.waitstatus_to_exitcode() fonksiyonu eklendi: bekleme durumunu çıkış koduna dönüştürün. (Victor Stinner tarafından bpo-40094 ‘de katılmıştır.)

pathlib

Added pathlib.Path.readlink() which acts similarly to os.readlink(). (Contributed by Girts Folkmanis in bpo-30618)

pdb

Artık Windows’ta Pdb ~/.pdbrc desteklemektedir. ( bpo-20523 içinde Tim Hopper ve Dan Lidral-Porter tarafından katılmıştır.)

poplib

POP3 and POP3_SSL now raise a ValueError if the given timeout for their constructor is zero to prevent the creation of a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)

pprint

pprint artık types.SimpleNamespace güzel yazdırabilir. (Carl Bordum Hansen tarafından bpo-37376 ‘da katılmıştır.)

pydoc

The documentation string is now shown not only for class, function, method etc, but for any object that has its own __doc__ attribute. (Contributed by Serhiy Storchaka in bpo-40257.)

random

Yeni bir random.Random.randbytes yöntemi eklendi: rastgele baytlar oluştur. (Victor Stinner tarafından bpo-40286 ‘da katılmıştır.)

signal

Bir pid yerine bir dosya tanımlayıcı kullanarak bir işleme sinyal göndermek için Linux’a özgü signal.pidfd_send_signal() ortaya çıktı. (bpo-38712)

smtplib

SMTP and SMTP_SSL now raise a ValueError if the given timeout for their constructor is zero to prevent the creation of a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)

LMTP constructor now has an optional timeout parameter. (Contributed by Donghee Na in bpo-39329.)

socket

The socket module now exports the CAN_RAW_JOIN_FILTERS constant on Linux 4.1 and greater. (Contributed by Stefan Tatschner and Zackery Spytz in bpo-25780.)

The socket module now supports the CAN_J1939 protocol on platforms that support it. (Contributed by Karl Ding in bpo-40291.)

Soket modülü artık socket.send_fds() ve socket.recv_fds() fonksiyonlarına sahiptir. (Joannah Nanjekye, Shinya Okano ve Victor Stinner’ın katkılarıyla bpo-28724.)

time

AIX üzerinde thread_time() artık 10 milisaniye çözünürlüğe sahip clock_gettime(CLOCK_THREAD_CPUTIME_ID) yerine nanosaniye çözünürlüğe sahip thread_cputime() ile uygulanmaktadır. (Batuhan Taşkaya bpo-40192 ‘de katılmıştır)

sys

Added a new sys.platlibdir attribute: name of the platform-specific library directory. It is used to build the path of standard library and the paths of installed extension modules. It is equal to "lib" on most platforms. On Fedora and SuSE, it is equal to "lib64" on 64-bit platforms. (Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in bpo-1294959.)

Previously, sys.stderr was block-buffered when non-interactive. Now stderr defaults to always being line-buffered. (Contributed by Jendrik Seipp in bpo-13601.)

tracemalloc

İzlenen bellek bloklarının tepe boyutunu geçerli boyuta ayarlamak ve belirli kod parçalarının zirvesini ölçmek için tracemalloc.reset_peak() eklendi. (Huon Wilson tarafından bpo-40630 ‘da katılmıştır.)

typing

PEP 593, mevcut türleri bağlama özel meta verilerle süslemek için bir typing.Annotated tipi ve çalışma zamanında meta verilere erişmek için typing.get_type_hints() için yeni include_extras parametresini tanıttı. (Till Varoquaux ve Konstantin Kashin’in katkılarıyla.)

unicodedata

Unicode veritabanı 13.0.0 sürümüne güncellendi. (bpo-39926).

venv

venv tarafından sağlanan aktivasyon betiklerinin tümü artık istem özelleştirmelerini her zaman __VENV_PROMPT__ tarafından belirtilen değeri kullanarak tutarlı bir şekilde belirtiyor. Önceden bazı komut dosyaları koşulsuz olarak __VENV_PROMPT__ kullandı, diğerleri yalnızca ayarlandıysa (varsayılan durum buydu) ve biri bunun yerine __VENV_NAME__ kullanıyordu. ( bpo-37663 içinde Brett Cannon tarafından katılmıştır.)

xml

Nitelikler içindeki boşluk karakterleri artık xml.etree.ElementTree XML dosyasına serileştirilirken korunur. EOLN’ler artık “n” olarak normalleştirilmez. Bu, XML spesifikasyonunun 2.11 bölümünün nasıl yorumlanacağına ilişkin tartışmanın sonucudur. ( bpo-39011 içinde Mefistotelis tarafından katılmıştır.)

Optimizasyonlar

  • Kavramalarda geçici bir değişken atamak için deyim optimize edildi. Şimdi for y in [expr], basit bir y = expr ataması kadar hızlıdır. Örneğin:

    sums = [s for s in [0] for x in data for s in [s + x]]

    := operatörünün aksine bu deyim, dış kapsama bir değişken sızdırmaz.

    ( bpo-32856 içinde Serhiy Storchaka tarafından katılmıştır.)

  • Çok iş parçacıklı uygulamalarda optimize edilmiş sinyal işleme. Ana iş parçacığından farklı bir iş parçacığı bir sinyal alırsa, işlenemeyen bekleyen sinyalleri kontrol etmek için bayt kodu değerlendirme döngüsü artık her bayt kodu talimatında kesintiye uğramaz. Yalnızca ana yorumlayıcının ana iş parçacığı sinyalleri işleyebilir.

    Önceden, bayt kodu değerlendirme döngüsü, ana iş parçacığı sinyalleri işleyene kadar her komutta kesintiye uğruyordu. (Victor Stinner tarafından bpo-40010 ‘da katılmıştır.)

  • subprocess modülünü FreeBSD’de closefrom() kullanarak optimize etti. ( bpo-38061 ‘de Ed Maste, Conrad Meyer, Kyle Evans, Kubilay Koçak ve Victor Stinner’ın katkılarıyla.)

  • PyLong_FromDouble(), long değerine uyan değerler için artık 1,87 kata kadar daha hızlı. (Sergey Fedoseev tarafından bpo-37986 ‘da katılmıştır.)

  • A number of Python builtins (range, tuple, set, frozenset, list, dict) are now sped up by using PEP 590 vectorcall protocol. (Contributed by Donghee Na, Mark Shannon, Jeroen Demeyer and Petr Viktorin in bpo-37207.)

  • Diğer kümenin temel kümeden çok daha büyük olduğu durumlar için difference_update() optimize edildi. ( bpo-8425 içinde Michele Orrù tarafından sağlanan kodla Evgeny Kapun tarafından önerilmiştir.)

  • Python’un küçük nesne ayırıcısı (obmalloc.c) artık (1’den fazla değil) bir boş arenanın işletim sistemine döndürmeden anında yeniden kullanım için kullanılabilir kalmasına izin veriyor. Bu, her yinelemede bir arenanın yeniden yaratılıp yok edilebileceği basit döngülerde çarpışmayı önler. ( bpo-37257 içinde Tim Peters tarafından katılmıştır.)

  • floor division of float operation now has a better performance. Also the message of ZeroDivisionError for this operation is updated. (Contributed by Donghee Na in bpo-39434.)

  • UTF-8 ve ascii codec’leriyle kısa ASCII dizilerinin kodunu çözmek artık yaklaşık %15 daha hızlı. (Inada Naoki tarafından bpo-37348 ‘de katılmıştır.)

İşte Python 3.4’ten Python 3.9’a kadar olan performans iyileştirmelerinin bir özeti:

Python version                       3.4     3.5     3.6     3.7     3.8    3.9
--------------                       ---     ---     ---     ---     ---    ---

Variable and attribute read access:
    read_local                       7.1     7.1     5.4     5.1     3.9    3.9
    read_nonlocal                    7.1     8.1     5.8     5.4     4.4    4.5
    read_global                     15.5    19.0    14.3    13.6     7.6    7.8
    read_builtin                    21.1    21.6    18.5    19.0     7.5    7.8
    read_classvar_from_class        25.6    26.5    20.7    19.5    18.4   17.9
    read_classvar_from_instance     22.8    23.5    18.8    17.1    16.4   16.9
    read_instancevar                32.4    33.1    28.0    26.3    25.4   25.3
    read_instancevar_slots          27.8    31.3    20.8    20.8    20.2   20.5
    read_namedtuple                 73.8    57.5    45.0    46.8    18.4   18.7
    read_boundmethod                37.6    37.9    29.6    26.9    27.7   41.1

Variable and attribute write access:
    write_local                      8.7     9.3     5.5     5.3     4.3    4.3
    write_nonlocal                  10.5    11.1     5.6     5.5     4.7    4.8
    write_global                    19.7    21.2    18.0    18.0    15.8   16.7
    write_classvar                  92.9    96.0   104.6   102.1    39.2   39.8
    write_instancevar               44.6    45.8    40.0    38.9    35.5   37.4
    write_instancevar_slots         35.6    36.1    27.3    26.6    25.7   25.8

Data structure read access:
    read_list                       24.2    24.5    20.8    20.8    19.0   19.5
    read_deque                      24.7    25.5    20.2    20.6    19.8   20.2
    read_dict                       24.3    25.7    22.3    23.0    21.0   22.4
    read_strdict                    22.6    24.3    19.5    21.2    18.9   21.5

Data structure write access:
    write_list                      27.1    28.5    22.5    21.6    20.0   20.0
    write_deque                     28.7    30.1    22.7    21.8    23.5   21.7
    write_dict                      31.4    33.3    29.3    29.2    24.7   25.4
    write_strdict                   28.4    29.9    27.5    25.2    23.1   24.5

Stack (or queue) operations:
    list_append_pop                 93.4   112.7    75.4    74.2    50.8   50.6
    deque_append_pop                43.5    57.0    49.4    49.2    42.5   44.2
    deque_append_popleft            43.7    57.3    49.7    49.7    42.8   46.4

Timing loop:
    loop_overhead                    0.5     0.6     0.4     0.3     0.3    0.3

These results were generated from the variable access benchmark script at: Tools/scripts/var_access_benchmark.py. The benchmark script displays timings in nanoseconds. The benchmarks were measured on an Intel® Core™ i7-4960HQ processor running the macOS 64-bit builds found at python.org.

Deprecated

  • Distutils bdist_msi komutu artık kullanımdan kaldırılmıştır, bunun yerine bdist_wheel (tekerlek paketleri) kullanın. ( bpo-39586 içinde Hugo van Kemenade tarafından katılmıştır.)

  • Şu anda math.factorial(), negatif olmayan tamsayı değerleri olan (5.0 gibi) float örneklerini kabul eder. İntegral olmayan ve negatif dalgalanmalar için bir ValueError oluşturur. Artık kullanımdan kaldırıldı. Gelecekteki Python sürümlerinde, tüm değişkenler için bir TypeError oluşturacaktır. ( bpo-37315 içinde Serhiy Storchaka tarafından katılmıştır.)

  • The parser and symbol modules are deprecated and will be removed in future versions of Python. For the majority of use cases, users can leverage the Abstract Syntax Tree (AST) generation and compilation stage, using the ast module.

  • The Public C API functions PyParser_SimpleParseStringFlags(), PyParser_SimpleParseStringFlagsFilename(), PyParser_SimpleParseFileFlags() and PyNode_Compile() are deprecated and will be removed in Python 3.10 together with the old parser.

  • Bir boole bağlamında NotImplemented kullanmak, neredeyse tamamen yanlış zengin karşılaştırıcı uygulamalarının bir sonucu olduğu için kullanımdan kaldırılmıştır. Python’un gelecekteki bir sürümünde TypeError haline getirilecektir. ( bpo-35712 içinde Josh Rosenberg tarafından katılmıştır.)

  • random modülü şu anda herhangi bir hashable türünü olası bir tohum değeri olarak kabul ediyor. Ne yazık ki, bu türlerden bazılarının deterministik bir hash değerine sahip olduğu garanti edilmiyor. Python 3.9’dan sonra, modül tohumlarını None, int, float, str, bytes ve bytearray ilesınırlayacaktır.

  • GzipFile dosyasının mode bağımsız değişkeni belirtilmeden yazmak için açılması kullanımdan kaldırılmıştır. Gelecekteki Python sürümlerinde, her zaman varsayılan olarak okumak için açılacaktır. Bir uyarı yazmak ve susturmak için açmak için mode argümanını belirtin. ( bpo-28286 içinde Serhiy Storchaka tarafından katılmıştır.)

  • Deprecated the split() method of _tkinter.TkappType in favour of the splitlist() method which has more consistent and predictable behavior. (Contributed by Serhiy Storchaka in bpo-38371.)

  • Eşyordam nesnelerinin açıkça asyncio.wait() öğesine iletilmesi kullanımdan kaldırılmıştır ve sürüm 3.11’de kaldırılacaktır. (Yury Selivanov ve Kyle Stanley tarafından bpo-34790 ‘da katılmıştır.)

  • binhex4 and hexbin4 standards are now deprecated. The binhex module and the following binascii functions are now deprecated:

    • b2a_hqx(), a2b_hqx()

    • rlecode_hqx(), rledecode_hqx()

    (Victor Stinner tarafından bpo-39353 ‘de katılmıştır.)

  • ast sınıfları slice, Index ve ExtSlice kullanımdan kaldırılmış kabul edilir ve gelecekteki Python sürümlerinde kaldırılacaktır. Index(value) yerine value kullanılmalıdır. ExtSlice(slices) yerine Tuple(slices, Load()) kullanılmalıdır. ( bpo-34822 içinde Serhiy Storchaka tarafından katılmıştır.)

  • ast sınıfları Suite, Param, AugLoad ve AugStore kullanımdan kaldırılmış kabul edilir ve gelecekteki Python sürümlerinde kaldırılacaktır. Ayrıştırıcı tarafından üretilmemişler ve Python 3’teki kod üreteci tarafından kabul edilmemişler. (bpo-39639 ve bpo-39969 ‘da Batuhan Taşkaya’nın ve bpo-39988 ‘deki Serhiy Storchaka’nın katkılarıyla.)

  • The PyEval_InitThreads() and PyEval_ThreadsInitialized() functions are now deprecated and will be removed in Python 3.11. Calling PyEval_InitThreads() now does nothing. The GIL is initialized by Py_Initialize() since Python 3.7. (Contributed by Victor Stinner in bpo-39877.)

  • shlex.split() işlevine ilk bağımsız değişken olarak None geçirmek kullanımdan kaldırılmıştır. ( bpo-33262 içinde Zackery Spytz tarafından katılmıştır.)

  • smtpd.MailmanProxy() is now deprecated as it is unusable without an external module, mailman. (Contributed by Samuel Colvin in bpo-35800.)

  • The lib2to3 module now emits a PendingDeprecationWarning. Python 3.9 switched to a PEG parser (see PEP 617), and Python 3.10 may include new language syntax that is not parsable by lib2to3’s LL(1) parser. The lib2to3 module may be removed from the standard library in a future Python version. Consider third-party alternatives such as LibCST or parso. (Contributed by Carl Meyer in bpo-40360.)

  • random.shuffle() öğesinin random parametresi kullanımdan kaldırıldı. (Katkı:Raymond Hettinger tarafından bpo-40465)

Kaldırılanlar

  • The erroneous version at unittest.mock.__version__ has been removed.

  • nntplib.NNTP: xpath() and xgtitle() methods have been removed. These methods are deprecated since Python 3.3. Generally, these extensions are not supported or not enabled by NNTP server administrators. For xgtitle(), please use nntplib.NNTP.descriptions() or nntplib.NNTP.description() instead. (Contributed by Donghee Na in bpo-39366.)

  • array.array: tostring() ve fromstring() yöntemleri kaldırıldı. Bunlar, Python 3.2’den beri kullanımda olmayan tobytes() ve frombytes() takma adlarıydı. (Victor Stinner tarafından bpo-38916 ‘da katılmıştır.)

  • Belgelenmemiş sys.callstats() fonksiyonu kaldırıldı. Python 3.7’den beri kullanımdan kaldırıldı ve her zaman None döndürdü. Python 3.7’de zaten kaldırılmış olan CALL_PROFILE adlı özel bir derleme seçeneği gerektiriyordu. (Victor Stinner tarafından bpo-37414 ‘de katılmıştır.)

  • sys.getcheckinterval() ve sys.setcheckinterval() işlevleri kaldırıldı. Python 3.2’den beri kullanımdan kaldırıldılar. Bunun yerine sys.getswitchinterval() ve sys.setswitchinterval() kullanın. (Victor Stinner tarafından bpo-37392 ‘de katılmıştır.)

  • PyImport_Cleanup() C işlevi kaldırıldı. Şu şekilde belgelenmiştir: “Modül tablosunu boşaltın. Yalnızca dahili kullanım için.” (Victor Stinner tarafından bpo-36710 ‘da katılmıştır.)

  • _dummy_thread ve dummy_threading modülleri kaldırıldı. Bu modüller, iş parçacığı desteği gerektiren Python 3.7’den beri kullanımdan kaldırılmıştır. (Victor Stinner tarafından bpo-37312 ‘de katılmıştır.)

  • aifc.openfp() alias to aifc.open(), sunau.openfp() alias to sunau.open(), and wave.openfp() alias to wave.open() have been removed. They were deprecated since Python 3.7. (Contributed by Victor Stinner in bpo-37320.)

  • The isAlive() method of threading.Thread has been removed. It was deprecated since Python 3.8. Use is_alive() instead. (Contributed by Donghee Na in bpo-37804.)

  • ElementTree modülündeki ElementTree ve Element sınıflarının getchildren() ve getiterator() yöntemleri kaldırıldı . Python 3.2’de kullanımdan kaldırıldılar. x.getchildren() yerine iter(x) ve x.getiterator() yerine x.iter() veya list(x.iter()) kullanın. ( bpo-36543 içinde Serhiy Storchaka tarafından katılmıştır.)

  • Eski plistlib API’si kaldırıldı, Python 3.4’ten beri kullanımdan kaldırıldı. load(), loads(), dump() ve dumps() işlevlerini kullanın. Ek olarak, use_builtin_types parametresi kaldırıldı, bunun yerine her zaman standart bytes nesneleri kullanıldı. (Jon Janzen tarafından bpo-36409 ‘da katılmıştır.)

  • PyGen_NeedsFinalizing C işlevi kaldırıldı. PEP 442 uygulandıktan sonra CPython içinde herhangi bir yerde belgelenmedi, test edilmedi veya kullanılmadı. Yama Joannah Nanjekye tarafından. (Joannah Nanjekye tarafından bpo-15088 ‘de katılmıştır)

  • Python 3.1’den beri kullanımdan kaldırılan base64.encodestring() ve base64.decodestring() takma adları kaldırıldı: bunun yerine base64.encodebytes() ve base64.decodebytes() kullanın. (Victor Stinner tarafından bpo-39351 ‘de katılmıştır.)

  • fractions.gcd() işlevi kaldırıldı, Python 3.5’ten beri kullanımdan kaldırıldı (bpo-22486): bunun yerine math.gcd() kullanın. (Victor Stinner tarafından bpo-39350 ‘de katılmıştır.)

  • bz2.BZ2File öğesinin buffering parametresi kaldırıldı. Python 3.0’dan bu yana yok sayıldı ve kullanıldığında bir DeprecationWarning yaydı. Dosyanın nasıl açılacağını kontrol etmek için bir açık dosya nesnesi iletin. (Victor Stinner tarafından bpo-39357 ‘de katılmıştır.)

  • json.loads() öğesinin encoding parametresi kaldırıldı. Python 3.1’den itibaren kullanımdan kaldırıldı ve göz ardı edildi; onu kullanmak Python 3.8’den beri bir DeprecationWarning yayınladı. (Inada Naoki’nin katkılarıyla bpo-39377)

  • with (awat asyncio.lock): ve with (get from asyncio.lock): ifadeleri artık desteklenmemektedir, bunun yerine async with lock kullanın. Aynı şey asyncio.Condition ve asyncio.Semaphore için de geçerlidir. (Andrew Svetlov tarafından bpo-34793 ‘de katılmıştır.)

  • The sys.getcounts() function, the -X showalloccount command line option and the show_alloc_count field of the C structure PyConfig have been removed. They required a special Python build by defining COUNT_ALLOCS macro. (Contributed by Victor Stinner in bpo-39489.)

  • typing.NamedTuple sınıfının _field_types özniteliği kaldırıldı. Python 3.8’den beri kullanımdan kaldırılmıştır. Bunun yerine __annotations__ özelliğini kullanın. (Serhiy Storchaka’nın bpo-40182 ‘deki katkısıyla)

  • The symtable.SymbolTable.has_exec() method has been removed. It was deprecated since 2006, and only returning False when it’s called. (Contributed by Batuhan Taskaya in bpo-40208)

  • The asyncio.Task.current_task() and asyncio.Task.all_tasks() have been removed. They were deprecated since Python 3.7 and you can use asyncio.current_task() and asyncio.all_tasks() instead. (Contributed by Rémi Lapeyre in bpo-40967)

  • html.parser.HTMLParser sınıfındaki unescape() metodu kaldırıldı (Python 3.4’ten beri kullanımdan kaldırıldı). html.unescape(), karakter referanslarını karşılık gelen unicode karakterlere dönüştürmek için kullanılmalıdır.

Python 3.9’a Taşıma

Bu bölüm, daha önce açıklanan değişiklikleri ve kodunuzda değişiklik gerektirebilecek diğer hata düzeltmelerini listeler.

Python API’sindeki Değişiklikler

  • __import__() ve importlib.util.resolve_name() şimdi daha önce ValueError oluşturduğu yerde ImportError ‘u yükseltiyor. Belirli istisna türünü yakalayan ve hem Python 3.9 hem de önceki sürümleri destekleyen arayanların, except (ImportError, ValueError): kullanarak her ikisini de yakalaması gerekir.

  • venv etkinleştirme betikleri, __VENV_PROMPT__ "" olarak ayarlandığında artık özel durum değildir.

  • The select.epoll.unregister() method no longer ignores the EBADF error. (Contributed by Victor Stinner in bpo-39239.)

  • bz2.BZ2File öğesinin compresslevel parametresi, buffering parametresi kaldırıldığı için yalnızca anahtar kelime haline geldi. (Victor Stinner tarafından bpo-39357 ‘de katılmıştır.)

  • Abonelik için basitleştirilmiş AST. Basit indeksler değerleri ile temsil edilecek, genişletilmiş dilimler demetler olarak temsil edilecektir. Index(value), bir value döndürür, ExtSlice(slices), Tuple(slices, Load()) döndürür. ( bpo-34822 ile Serhiy Storchaka tarafından katılmıştır.)

  • importlib modülü artık -E veya -I komut satırı seçenekleri kullanılırken PYTHONCASEOK ortam değişkenini yok sayar.

  • kodlama parametresi ftplib.FTP ve ftplib.FTP_TLS sınıflarına yalnızca anahtar kelime parametresi olarak eklendi ve varsayılan kodlama Latin-1’den UTF-8’e değiştirilerek RFC 2640 olarak değiştirildi .

  • asyncio.loop.shutdown_default_executor(), AbstractEventLoop öğesine eklendi, yani ondan devralan alternatif olay döngülerinde bu yöntem tanımlanmalıdır. (Kyle Stanley tarafından bpo-34037 ‘de katılmıştır.)

  • __future__ modülündeki gelecek bayraklarının sabit değerleri, derleyici bayraklarıyla çarpışmayı önlemek için güncellenir. Daha önce PyCF_ALLOW_TOP_LEVEL_AWAIT, CO_FUTURE_DIVISION ile çakışıyordu. (Batuhan Taskaya bpo-39562 ‘de katılmıştır)

  • array('u') now uses wchar_t as C type instead of Py_UNICODE. This change doesn’t affect to its behavior because Py_UNICODE is alias of wchar_t since Python 3.3. (Contributed by Inada Naoki in bpo-34538.)

  • logging.getLogger() API’si artık root' adı iletildiğinde kök kaydediciyi döndürürken, daha önce 'root' adlı kök olmayan bir günlükçü döndürdü. Bu, kullanıcı kodunun 'root' adlı kök olmayan bir günlükçüyü açıkça istediği veya 'root.py' adlı bazı üst düzey modüllerde logging.getLogger(__name__) kullanarak bir günlükçü başlattığı durumları etkileyebilir. ( bpo-37742 içinde Vinay Sajip tarafından katılmıştır.)

  • Division handling of PurePath now returns NotImplemented instead of raising a TypeError when passed something other than an instance of str or PurePath. This allows creating compatible classes that don’t inherit from those mentioned types. (Contributed by Roger Aiudi in bpo-34775).

  • Python 3.9.5’ten itibaren ipaddress modülü artık IPv4 adres dizilerinde baştaki sıfırları kabul etmemektedir. Öndeki sıfırlar belirsizdir ve bazı kitaplıklar tarafından sekizli gösterim olarak yorumlanır. Örneğin, eski işlev socket.inet_aton() baştaki sıfırları sekizli gösterim olarak ele alır. Modern inet_pton() glibc uygulaması baştaki sıfırları kabul etmez. ( bpo-36384 içinde Christian Heimes tarafından katılmıştır).

  • codecs.lookup() artık kodlama adını encodings.normalize_encoding() ile aynı şekilde normalleştirir, ancak codecs.lookup() ayrıca adı küçük harfe dönüştürür. Örneğin, "latex+latin1" kodlama adı artık "latex_latin1" olarak normalleştirildi. ( bpo-37751 ‘de Jordon Xu tarafından katılmıştır.)

C API’sindeki değişiklikler

  • heap-allocated type örnekleri ( PyType_FromSpec() ve benzer API’ler ile oluşturulanlar gibi), Python 3.8’den bu yana tür nesnesine bir başvuru içerir. Python 3.8’in “C API’sindeki Değişiklikler” bölümünde belirtildiği gibi, vakaların büyük çoğunluğu için herhangi bir yan etki olmamalıdır, ancak özel bir tp_traverse ‘ya sahip türler için tüm özel tp_traverse yığın işlevlerinin yapıldığından emin olun. tahsis edilen tipler, nesnenin tipini ziyaret eder.

    Örnek:

    int
    foo_traverse(foo_struct *self, visitproc visit, void *arg) {
    // Rest of the traverse function
    #if PY_VERSION_HEX >= 0x03090000
        // This was not needed before Python 3.9 (Python issue 35810 and 40217)
        Py_VISIT(Py_TYPE(self));
    #endif
    }
    

    Geçiş işleviniz, temel sınıfının (veya başka bir türün) tp_traverse için yetkisini veriyorsa, Py_TYPE(self) öğesinin yalnızca bir kez ziyaret edildiğinden emin olun. Yalnızca heap type ‘ın tp_traverse içindeki tipi ziyaret etmesinin beklendiğini unutmayın.

    Örneğin, tp_traverse işleviniz aşağıdakileri içeriyorsa:

    base->tp_traverse(self, visit, arg)
    

    then add:

    #if PY_VERSION_HEX >= 0x03090000
        // This was not needed before Python 3.9 (bpo-35810 and bpo-40217)
        if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) {
            // a heap type's tp_traverse already visited Py_TYPE(self)
        } else {
            Py_VISIT(Py_TYPE(self));
        }
    #else
    

    (Daha fazla bilgi için bkz. bpo-35810 ve bpo-40217.)

  • PyEval_CallObject, PyEval_CallFunction, PyEval_CallMethod ve PyEval_CallObjectWithKeywords işlevleri kullanımdan kaldırılmıştır. Bunun yerine PyObject_Call() ve türevlerini kullanın. (Daha fazla ayrıntı için bpo-29548 konusuna bakın.)

CPython bayt kodu değişiklikleri

  • LOAD_ASSERTION_ERROR işlem kodu, assert ifadesini işlemek için eklendi. Önceden, AssertionError istisnası gölgeleniyorsa, iddia ifadesi düzgün çalışmıyordu. ( bpo-34880 içinde Zackery Spytz tarafından katılmıştır.)

  • COMPARE_OP işlem kodu dört farklı talimata bölünmüştür:

    • Zengin karşılaştırmalar için COMPARE_OP

    • ‘-dir’ ve ‘değildir’ testleri için IS_OP

    • İçeride ve içeride değil testleri için CONTAINS_OP

    • ‘try-except’ ifadelerindeki istisnaları kontrol etmek için JUMP_IF_NOT_EXC_MATCH.

    (Mark Shannon tarafından bpo-39156 ‘da katılmıştır.)

Yapı Değişiklikleri

  • Added --with-platlibdir option to the configure script: name of the platform-specific library directory, stored in the new sys.platlibdir attribute. See sys.platlibdir attribute for more information. (Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in bpo-1294959.)

  • COUNT_ALLOCS özel yapı makrosu kaldırıldı. (Victor Stinner tarafından bpo-39489 ‘da katılmıştır.)

  • On non-Windows platforms, the setenv() and unsetenv() functions are now required to build Python. (Contributed by Victor Stinner in bpo-39395.)

  • Windows dışı platformlarda, bdist_wininst yükleyicilerin oluşturulması artık resmi olarak desteklenmemektedir. (Daha fazla ayrıntı için bkz. bpo-10945.)

  • Python’u macOS’ta kaynaktan derlerken, _tkinter, macOS’un eski sürümlerinde olduğu gibi, /Library/Frameworks içine yüklenmişlerse artık sistem dışı Tcl ve Tk çerçeveleriyle bağlantı kuruyor. Bir macOS SDK, --enable-universalsdk veya -isysroot kullanılarak açıkça yapılandırılmışsa, yalnızca SDK’nın kendisi aranır. Varsayılan davranış yine de --with-tcltk-includes ve --with-tcltk-libs ile geçersiz kılınabilir. ( bpo-34956 içinde Ned Deily tarafından katılmıştır.)

  • Python can now be built for Windows 10 ARM64. (Contributed by Steve Dower in bpo-33125.)

  • --pgo kullanıldığında bazı bireysel testler artık atlanıyor. Söz konusu testler, PGO görev süresini önemli ölçüde artırdı ve muhtemelen nihai yürütülebilir dosyanın optimizasyonunun iyileştirilmesine yardımcı olmadı. Bu, görevi yaklaşık 15 kat hızlandırır. Tam birim test paketini çalıştırmak yavaştır. Bu değişiklik, çok fazla kod dalı yürütülmeyeceğinden biraz daha az optimize edilmiş bir yapıya neden olabilir. Çok daha yavaş olan yapıyı beklemek istiyorsanız, ./configure [..] PROFILE_TASK="-m test --pgo-extended" kullanılarak eski davranış geri yüklenebilir. Hangi PGO görev setinin daha hızlı bir yapı oluşturduğuna dair hiçbir garanti vermiyoruz. Sonuçlar ortama, iş yüküne ve derleyici araç zincirine bağlı olabileceğinden, önemseyen kullanıcılar kendi ilgili kıyaslamalarını çalıştırmalıdır. (Daha fazla ayrıntı için bkz. bpo-36044 ve bpo-37707.)

C API’sindeki değişiklikler

Yeni Özellikler

  • PEP 573: Added PyType_FromModuleAndSpec() to associate a module with a class; PyType_GetModule() and PyType_GetModuleState() to retrieve the module and its state; and PyCMethod and METH_METHOD to allow a method to access the class it was defined in. (Contributed by Marcel Plch and Petr Viktorin in bpo-38787.)

  • PyFrame_GetCode() işlevi eklendi: bir çerçeve kodu alın. PyFrame_GetBack() işlevi eklendi: sonraki dış çerçeveyi alın. (Victor Stinner tarafından bpo-40421 ‘de katılmıştır.)

  • Sınırlı C API’sine PyFrame_GetLineNumber() eklendi. (Victor Stinner tarafından bpo-40421 ‘de katılmıştır.)

  • Yorumlayıcıyı almak için PyThreadState_GetInterpreter() ve PyInterpreterState_Get() işlevleri eklendi. Python iş parçacığı durumunun geçerli çerçevesini almak için PyThreadState_GetFrame() işlevi eklendi. PyThreadState_GetID() işlevi eklendi: Python iş parçacığı durumunun benzersiz tanımlayıcısını alın. (Victor Stinner tarafından bpo-39947 ‘de katılmıştır.)

  • C API’ye herhangi bir bağımsız değişken olmadan çağrılabilir bir Python nesnesi çağıran yeni bir genel PyObject_CallNoArgs() işlevi eklendi. Herhangi bir argüman olmadan çağrılabilir bir Python nesnesini çağırmanın en etkili yolu budur. (Victor Stinner tarafından bpo-37194 ‘de katılmıştır.)

  • Sınırlı C API’sindeki değişiklikler (eğer Py_LIMITED_API makrosu tanımlanmışsa):

    • Sınırlı API için normal işlevler olarak Py_EnterRecursiveCall() ve Py_LeaveRecursiveCall() sağlayın. Önceden, makrolar olarak tanımlanmıştı, ancak bu makrolar, PyThreadState.recursion_Definition alanına erişemeyen sınırlı C API’si ile derlenmiyordu (sınırlı C API’sinde yapı opaktır).

    • PyObject_INIT() ve PyObject_INIT_VAR(), uygulama ayrıntılarını gizlemek için normal “opak” fonksiyon haline gelir.

    (Victor Stinner tarafından bpo-38644 ve bpo-39542 ‘de katılmıştır.)

  • The PyModule_AddType() function is added to help adding a type to a module. (Contributed by Donghee Na in bpo-40024.)

  • Genel API’ye PyObject_GC_IsTracked() ve PyObject_GC_IsFinalized() işlevleri, Python nesnelerinin şu anda izlenip izlenmediğini veya çöp toplayıcı tarafından halihazırda sonlandırılıp sonlandırılmadığını sorgulamaya izin vermek için eklendi. (Pablo Galindo Salgado tarafından bpo-40241 ‘de katılmıştır.)

  • Added _PyObject_FunctionStr() to get a user-friendly string representation of a function-like object. (Patch by Jeroen Demeyer in bpo-37645.)

  • Tek bir konum bağımsız değişkeni olan bir nesneyi çağırmak için PyObject_CallOneArg() eklendi (Yama Jeroen Demeyer tarafından bpo-37483 içinde.)

Python 3.9’a Taşıma

  • PyInterpreterState.eval_frame (PEP 523) artık yeni bir zorunlu tstate parametresi (PyThreadState*) gerektiriyor. (Victor Stinner tarafından bpo-38500 ‘de katılmıştır.)

  • Genişletme modülleri: m_traverse, m_clear and m_free functions of PyModuleDef, modül durumu talep edilmiş ancak henüz tahsisedilmemişse artık çağrılmaz. Bu, modül oluşturulduktan hemen sonra vemodül çalıştırılmadan önceki durumdur (Py_mod_exec işlevi).Daha kesin olarak, bu işlevler m_size 0’dan büyükse ve modül durumu ( PyModule_GetState() tarafından döndürülen) NULL ise çağrılmaz.

    Modül durumuna sahip olmayan genişletme modülleri (m_size <= 0) etkilenmez.

  • Bir alt yorumlayıcıda Py_AddPendingCall() çağrılırsa, işlev artık ana yorumlayıcıdan çağrılmak yerine alt yorumlayıcıdan çağrılacak şekilde programlanır. Her yardımcı tercüman artık kendi planlanmış çağrılar listesine sahiptir. (Victor Stinner tarafından bpo-39984’de katılmıştır.)

  • Windows kayıt defteri -E seçeneği kullanıldığında ( PyConfig.use_environment 0 olarak ayarlanmışsa) sys.path öğesini başlatmak için artık kullanılmaz. Bu, Python’u Windows’a yerleştirirken önemlidir. ( bpo-8901 içinde Zackery Spytz tarafından katılmıştır.)

  • PyStructSequence_UnnamedField genel değişkeni artık bir sabittir ve sabit bir dizeye başvurur. ( bpo-38650 içinde Serhiy Storchaka tarafından katılmıştır.)

  • The PyGC_Head structure is now opaque. It is only defined in the internal C API (pycore_gc.h). (Contributed by Victor Stinner in bpo-40241.)

  • The Py_UNICODE_COPY, Py_UNICODE_FILL, PyUnicode_WSTR_LENGTH, PyUnicode_FromUnicode(), PyUnicode_AsUnicode(), _PyUnicode_AsUnicode, and PyUnicode_AsUnicodeAndSize() are marked as deprecated in C. They have been deprecated by PEP 393 since Python 3.3. (Contributed by Inada Naoki in bpo-36346.)

  • Py_FatalError() fonksiyonu, Py_LIMITED_API makrosu tanımlanmadığı sürece geçerli fonksiyonun adını otomatik olarak kaydeden bir makro ile değiştirilir. (Victor Stinner tarafından bpo-39882 ‘de katılmıştır.)

  • Vectorcall protokolü artık arayan kişinin anahtar kelime adları olarak yalnızca dizeleri iletmesini gerektirir. (Daha fazla bilgi için bkz. bpo-37540.)

  • Bir dizi makro ve fonksiyonların uygulama ayrıntıları artık gizlenmiştir:

    (Daha fazla ayrıntı için bkz. bpo-40170.)

Kaldırılanlar

  • pyfpe.h dosyasının PyFPE_START_PROTECT() ve PyFPE_END_PROTECT() makroları sınırlı C API’sinden hariç tutuldu. (Victor Stinner tarafından bpo-38835 ‘de katılmıştır.)

  • PyTypeObject öğesinin tp_print yuvası kaldırıldı. Python 2.7 ve öncesindeki dosyalara nesneleri yazdırmak için kullanılıyordu. Python 3.0’dan beri göz ardı edildi ve kullanılmadı. ( bpo-36974 içinde Jeroen Demeyer tarafından katılmıştır.)

  • Sınırlı C API’sindeki değişiklikler (eğer Py_LIMITED_API makrosu tanımlanmışsa):

    • Aşağıdaki fonksiyonlar sınırlı C API’sinden çıkarıldı:

      • PyThreadState_DeleteCurrent() (Joannah Nanjekye tarafından bpo-37878 ‘de katılmıştır.)

      • _Py_CheckRecursionLimit

      • _Py_NewReference()

      • _Py_ForgetReference()

      • _PyTraceMalloc_NewReference()

      • _Py_GetRefTotal()

      • Sınırlı C API’sinde hiçbir zaman çalışmayan çöp tenekesi mekanizması.

      • PyTrash_UNWIND_LEVEL

      • Py_TRASHCAN_BEGIN_CONDITION

      • Py_TRASHCAN_BEGIN

      • Py_TRASHCAN_END

      • Py_TRASHCAN_SAFE_BEGIN

      • Py_TRASHCAN_SAFE_END

    • Aşağıdaki fonksiyonlar ve tanımlar dahili C API’sine taşındı:

      • _PyDebug_PrintTotalRefs()

      • _Py_PrintReferences()

      • _Py_PrintReferenceAddresses()

      • _Py_tracemalloc_config

      • _Py_AddToAllObjects() (Py_TRACE_REFS yapısına özel)

    (Victor Stinner tarafından bpo-38644 ve bpo-39542 ‘de katılmıştır.)

  • _PyRuntime.getframe kancası kaldırıldı ve _PyRuntime.getframe için takma ad olan _PyThreadState_GetFrame makrosu kaldırıldı. Yalnızca dahili C API’si tarafından açığa çıkarıldılar. Ayrıca PyThreadFrameGetter türü kaldırıldı. (Victor Stinner tarafından bpo-39946 ‘da katılmıştır.)

  • Aşağıdaki fonksiyonlar C API’sinden kaldırıldı. Tüm ücretsiz listeleri temizlemek için PyGC_Collect() çağırın. (Inada Naoki ve Victor Stinner tarafından bpo-37340 , bpo-38896 ve bpo-40428 ‘de katkıda bulunmuştur.)

    • PyAsyncGen_ClearFreeLists()

    • PyContext_ClearFreeList()

    • PyDict_ClearFreeList()

    • PyFloat_ClearFreeList()

    • PyFrame_ClearFreeList()

    • PyList_ClearFreeList()

    • PyMethod_ClearFreeList() ve PyCFunction_ClearFreeList(): bağlı yöntem nesnelerinin serbest listeleri kaldırıldı.

    • PySet_ClearFreeList(): Python 3.4’te setsiz liste kaldırıldı.

    • PyTuple_ClearFreeList()

    • PyUnicode_ClearFreeList(): Unicode ücretsiz listesi Python 3.3’te kaldırılmıştır.

  • _PyUnicode_ClearStaticStrings() fonksiyonu kaldırıldı. (Victor Stinner tarafından bpo-39465 ‘de katılmıştır.)

  • Py_UNICODE_MATCH kaldırıldı. PEP 393 tarafından kullanımdan kaldırıldı ve Python 3.3’ten beri bozuldu. Bunun yerine PyUnicode_Tailmatch() fonksiyonu kullanılabilir. (Inada Naoki tarafından bpo-36346 ‘da katılmıştır.)

  • Tanımlanan ancak uygulama içermeyen arabirimlerin başlık dosyaları temizlendi. Kaldırılmakta olan genel API sembolleri şunlardır: : _PyBytes_InsertThousandsGroupingLocale, _PyBytes_InsertThousandsGrouping, _Py_InitializeFromArgs, _Py_InitializeFromWideArgs, _PyFloat_Repr, _PyFloat_Digits, _PyFloat_DigitsInit, PyFrame_ExtendStack, _PyAIterWrapper_Type, PyNullImporter_Type, PyCmpWrapper_Type, PySortWrapper_Type, PyNoArgsFunction. ( bpo-39372 içinde Pablo Galindo Salgado tarafından sağlanmıştır.)

Python 3.9.1’deki önemli değişiklikler

typing

typing.Literal davranışı, PEP 586 ile uyumlu olacak ve PEP’de belirtilen statik tip denetleyicilerin davranışıyla eşleşecek şekilde değiştirildi.

  1. Literal artık parametrelerin yinelemelerini kaldırıyor.

  2. Literal nesneleri arasındaki eşitlik karşılaştırmaları artık sıradan bağımsızdır.

  3. Literal karşılaştırmaları artık türlere göre yapılıyor. Örneğin, Literal[0] == Literal[False] daha önce True olarak değerlendirildi. Artık False. Bu değişikliği desteklemek için dahili olarak kullanılan tür önbelleği artık farklılaşan türleri desteklemektedir.

  4. Literal nesneler, parametrelerinden herhangi biri hashable değilse eşitlik karşılaştırmaları sırasında artık bir TypeError istisnası oluşturacak. Değişken parametrelerle Literal tanımlamanın bir hata atmayacağına dikkat edin:

    >>> from typing import Literal
    >>> Literal[{0}]
    >>> Literal[{0}] == Literal[{False}]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'set'
    

( bpo-42345 sayısında Yurii Karabas tarafından katılmıştır.)

macOS 11.0 (Big Sur) ve Apple Silicon Mac desteği

3.9.1’den itibaren Python artık macOS 11.0 (Big Sur) ve Apple Silicon Mac’lerde (ARM64 yapısına dayalı) oluşturmayı ve çalıştırmayı tam olarak desteklemektedir. Yeni bir evrensel yapı varyantı olan universal2, artık hem ARM64 hem de Intel 64 ‘ü tek bir yürütülebilir dosya setinde yerel olarak desteklemek için kullanılabilir. İkili dosyalar, artık bir dizi eski macOS sürümüne (10.9’a göre test edilmiştir) dağıtılmak üzere macOS’in mevcut sürümleri üzerine inşa edilebilirken, çalışma zamanında kullanılan işletim sistemi sürümüne bağlı olarak bazı yeni işletim sistemi fonksiyonları ve seçenekleri koşullu olarak kullanılabilir hale getirilir (“weaklinking” ).

( bpo-41100 içinde Ronald Oussoren ve Lawrence D’Anna tarafından katılmıştır.)

Python 3.9.2’deki önemli değişiklikler

collections.abc

collections.abc.Callable jenerik artık tip parametrelerini düzleştiriyor, şu anda typing.Callable ‘ın yaptığına benzer. Bu, collections.abc.Callable[[int, str], str] öğesinin __args__ veya (int, str, str); olacağı anlamına gelir önceden bu ([int, str], str) idi. Bu değişikliğe izin vermek için, types.GenericAlias artık alt sınıflara ayrılabilir ve collections.abc.Callable tipi abone olurken bir alt sınıf döndürülür. Bağımsız değişkenlere typing.get_args() veya __args__ aracılığıyla erişen kodun bu değişikliği hesaba katması gerekir. Python 3.9.1’de sessizce geçmiş olabilecek collections.abc.Callable parametreleştirmenin geçersiz biçimleri için bir DeprecationWarning yayınlanabilir. Python 3.10’da bu DeprecationWarning bir TypeError olacaktır. ( bpo-42195 içinde Ken Jin tarafından katılmıştır.)

urllib.parse

Earlier Python versions allowed using both ; and & as query parameter separators in urllib.parse.parse_qs() and urllib.parse.parse_qsl(). Due to security concerns, and to conform with newer W3C recommendations, this has been changed to allow only a single separator key, with & as the default. This change also affects cgi.parse() and cgi.parse_multipart() as they use the affected functions internally. For more details, please see their respective documentation. (Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in bpo-42967.)

Notable changes in Python 3.9.3

A security fix alters the ftplib.FTP behavior to not trust the IPv4 address sent from the remote server when setting up a passive data channel. We reuse the ftp server IP address instead. For unusual code requiring the old behavior, set a trust_server_pasv_ipv4_address attribute on your FTP instance to True. (See gh-87451)

Notable changes in Python 3.9.5

urllib.parse

The presence of newline or tab characters in parts of a URL allows for some forms of attacks. Following the WHATWG specification that updates RFC 3986, ASCII newline \n, \r and tab \t characters are stripped from the URL by the parser in urllib.parse preventing such attacks. The removal characters are controlled by a new module level variable urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE. (See gh-88048)

Notable security feature in 3.9.14

Converting between int and str in bases other than 2 (binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal) now raises a ValueError if the number of digits in string form is above a limit to avoid potential denial of service attacks due to the algorithmic complexity. This is a mitigation for CVE 2020-10735. This limit can be configured or disabled by environment variable, command line flag, or sys APIs. See the integer string conversion length limitation documentation. The default limit is 4300 digits in string form.

Notable changes in 3.9.17

tarfile

  • The extraction methods in tarfile, and shutil.unpack_archive(), have a new a filter argument that allows limiting tar features than may be surprising or dangerous, such as creating files outside the destination directory. See Extraction filters for details. In Python 3.12, use without the filter argument will show a DeprecationWarning. In Python 3.14, the default will switch to 'data'. (Contributed by Petr Viktorin in PEP 706.)