# 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.)

- `lib2to3` modülü artık bir `PendingDeprecationWarning` yayar. Python 3.9, bir PEG ayrıştırıcısına geçti (bkz. PEP 617) ve Python 3.10, lib2to3’ün LL(1) ayrıştırıcısı tarafından ayrıştırılamayan yeni dil sözdizimini içerebilir. `lib2to3` modülü, gelecekteki bir Python sürümünde standart kitaplıktan kaldırılabilir. LibCST veya parso gibi üçüncü taraf alternatiflerini göz önünde bulundurun. (Carl Meyer tarafından bpo-40360 ‘da katılmıştır.)

- `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:

  - `PyObject_IS_GC()` makrosu bir fonksiyona dönüştürüldü.

  - The `PyObject_NEW()` macro becomes an alias to the `PyObject_New` macro, and the `PyObject_NEW_VAR()` macro becomes an alias to the `PyObject_NewVar` macro. They no longer access directly the `PyTypeObject.tp_basicsize` member.

  - `PyObject_GET_WEAKREFS_LISTPTR()` macro was converted to a function: the macro accessed directly the `PyTypeObject.tp_weaklistoffset` member.

  - `PyObject_CheckBuffer()` makrosu bir fonksiyona dönüştürüldü: makro `PyTypeObject.tp_as_buffer` üyesine doğrudan erişti.

  - `PyIndex_Check()` artık uygulama ayrıntılarını gizlemek için her zaman opak bir fonksiyon olarak bildiriliyor: `PyIndex_Check()` makrosu kaldırıldı. Makro, `PyTypeObject.tp_as_number` üyesine doğrudan erişti.

  (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

Önceki Python sürümleri, `urllib.parse.parse_qs()` ve `urllib.parse.parse_qsl()` içinde sorgu parametresi ayırıcıları olarak hem `;` hem de `&` kullanılmasına izin veriyordu. Güvenlik endişeleri nedeniyle ve daha yeni W3C tavsiyelerine uymak için bu, varsayılan olarak `&` ile yalnızca tek bir ayırıcı anahtara izin verecek şekilde değiştirildi. Bu değişiklik, etkilenen fonksiyonlar dahili olarak kullandıkları için `cgi.parse()` ve `cgi.parse_multipart()` ‘ı da etkiler. Daha fazla ayrıntı için lütfen ilgili belgelere bakın. (Adam Goldschmidt, Senthil Kumaran ve Ken Jin’in katkılarıyla 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.)