Python 3.8’deki Yenilikler

Editör:

Raymond Hettinger

Bu makale, 3.7 ile karşılaştırıldığında Python 3.8 ‘deki yeni özellikleri açıklamaktadır. Tüm ayrıntılar için Changelog ‘a bakın.

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

Yeni Özellikler

Atama ifadeleri

Daha büyük bir ifadenin parçası olarak değişkenlere değerler atayan yeni sözdizimi := var. Bir morsun gözlerine ve dişlerine benzerliği nedeniyle “mors operatörü” olarak bilinir.

Bu örnekte, atama ifadesi len() öğesini iki kez çağırmaktan kaçınmaya yardımcı olur:

if (n := len(a)) > 10:
    print(f"List is too long ({n} elements, expected <= 10)")

Benzer bir fayda, eşleştirme nesnelerine iki kez ihtiyaç duyulan normal ifade eşleştirme sırasında ortaya çıkar; bir kez bir eşleşme olup olmadığını test etmek ve başka bir kez bir alt grup çıkarmak için:

discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0

Operatör, döngü sonlandırmasını test etmek için bir değer hesaplayan ve ardından döngü gövdesinde aynı değere tekrar ihtiyaç duyan while döngülerinde de kullanışlıdır:

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)

Başka bir motive edici kullanım durumu, bir filtreleme koşulunda hesaplanan bir değerin ifade gövdesinde de gerekli olduğu liste üreteçlerinde ortaya çıkar:

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]

Karmaşıklığı azaltan ve okunabilirliği artıran vakaları temizlemek için mors operatörünün kullanımını sınırlamaya çalışın.

Tam açıklama için PEP 572 konusuna bakın.

(Emily Morehouse’un bpo-35224 ‘teki katkısıyla.)

Yalnızca konumsal parametreler

There is a new function parameter syntax / to indicate that some function parameters must be specified positionally and cannot be used as keyword arguments. This is the same notation shown by help() for C functions annotated with Larry Hastings’ Argument Clinic tool.

Aşağıdaki örnekte, a ve b parametreleri yalnızca konumsaldır, c veya d konumsal veya anahtar sözcük olabilir ve e veya f’nin anahtar sözcük olması gerekir:

def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)

Aşağıdaki geçerli bir çağrıdır:

f(10, 20, 30, d=40, e=50, f=60)

Ancak, bunlar geçersiz çağrılardır:

f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument

Bu gösterim için bir kullanım durumu, saf Python fonksiyonlarının mevcut C kodlu fonksiyonlarının davranışlarını tam olarak taklit etmesine izin vermesidir. Örneğin, yerleşik divmod() fonksiyonu, anahtar kelime bağımsız değişkenlerini kabul etmez:

def divmod(a, b, /):
    "Emulate the built in divmod() function"
    return (a // b, a % b)

Başka bir kullanım durumu, parametre adı yardımcı olmadığında anahtar kelime bağımsız değişkenlerini engellemektir. Örneğin, yerleşik len() işlevi len(obj, /) imzasına sahiptir. Bu, aşağıdaki gibi garip çağrıları engeller:

len(obj='hello')  # The "obj" keyword argument impairs readability

Bir parametreyi yalnızca konumsal olarak işaretlemenin başka bir yararı da, parametre adının gelecekte yerel kodunu kırma riski olmadan değiştirilmesine izin vermesidir. Örneğin, statistics modülünde, dist parametre adı gelecekte değiştirilebilir. Bu, aşağıdaki fonksiyon belirtimi ile mümkün olmuştur:

def quantiles(dist, /, *, n=4, method='exclusive')
    ...

/ öğesinin solundaki parametreler olası anahtar kelimeler olarak gösterilmediğinden, parametre adları **kwargs içinde kullanılmaya devam eder:

>>> def f(a, b, /, **kwargs):
...     print(a, b, kwargs)
...
>>> f(10, 20, a=1, b=2, c=3)         # a and b are used in two ways
10 20 {'a': 1, 'b': 2, 'c': 3}

Bu, rasgele anahtar kelime bağımsız değişkenlerini kabul etmesi gereken fonksiyonlarının ve yöntemlerin uygulanmasını büyük ölçüde basitleştirir. Örneğin, collections modülündeki koddan bir alıntı:

class Counter(dict):

    def __init__(self, iterable=None, /, **kwds):
        # Note "iterable" is a possible keyword argument

Tam açıklama için PEP 570 ‘e bakın.

(Pablo Galindo’nun bpo-36540 ‘taki katkısıyla.)

Derlenmiş bayt kodu dosyaları için paralel dosya sistemi önbelleği

Yeni PYTHONPYCACHEPREFIX ayarı ( -X pycache_prefix olarak da mevcuttur), örtük bayt kodu önbelleğini, içindeki varsayılan __pycache__ alt dizinleri yerine ayrı bir paralel dosya sistemi ağacı kullanacak şekilde yapılandırır.

Önbelleğin konumu sys.pycache_prefix içinde rapor edilir (None, __pycache__ alt dizinlerindeki varsayılan konumu belirtir).

(Carl Meyer’ın bpo-33499 ‘daki katkısıyla.)

Hata ayıklama derlemesi, yayın derlemesiyle aynı ABI’yi kullanır

Python artık sürüm veya hata ayıklama modunda oluşturulduğunda aynı ABI’yi kullanıyor. Unix’te, Python hata ayıklama modunda oluşturulduğunda, artık sürüm modunda oluşturulmuş C uzantılarını ve kararlı ABI kullanılarak oluşturulmuş C uzantılarını yüklemek mümkündür.

Release ve hata ayıklama derlemeleri artık ABI ile uyumludur: Py_DEBUG makrosunu tanımlamak artık tek ABI uyumsuzluğunu ortaya çıkaran Py_TRACE_REFS makrosunu gerektirmez. sys.getobjects() fonksiyonunu ve PYTHONDUMPREFS ortam değişkenini ekleyen Py_TRACE_REFS makrosu, yeni ./configure --with-trace-refs derleme seçeneği kullanılarak ayarlanabilir.(Victor Stinner’ın’ bpo-36465 ‘deki katkısıyla.)

Unix’te, Android ve Cygwin dışında C uzantıları artık libpython’a bağlı değildir. Statik olarak bağlı bir Python’un, paylaşılan bir Python kitaplığı kullanılarak oluşturulmuş bir C uzantısını yüklemesi artık mümkün. (Victor Stinner’ın bpo-21536 ‘daki katkısıyla.)

Unix’te, Python hata ayıklama modunda oluşturulduğunda, import artık yayın modunda derlenen C uzantılarını ve kararlı ABI ile derlenen C uzantılarını da arar. (Victor Stinner’ın bpo-36722 ‘deki katkısıyla.)

Python’u bir uygulamaya gömmek için, -lpython3.8 (uygulamayı libpython’a bağlamak) elde etmek için python3-config --libs --embed seçeneğine yeni bir --embed seçeneği aktarılmalıdır. Hem 3.8 hem de daha eski sürümleri desteklemek için, önce python3-config --libs --embed seçeneğini deneyin ve önceki komut başarısız olursa python3-config --libs (--embed olmadan) seçeneğine geri dönün.

Python’u bir uygulamaya gömmek için bir pkg-config python-3.8-embed modülü ekleyin: pkg-config python-3.8-embed --libs -lpython3.8 içerir. Hem 3.8 hem de daha eski sürümleri desteklemek için, önce pkg-config python-X.Y-embed --libs komutunu deneyin ve önceki komut başarısız olursa pkg-config python-X.Y --libs (--embed olmadan) komutuna geri dönün (X.Y yerine Python sürümünü yazın).

Öte yandan, pkg-config python3.8 --libs artık -lpython3.8 içermiyor. C uzantıları libpython’a bağlanmamalıdır (durumları dize tarafından işlenen Android ve Cygwin hariç); bu değişiklik kasıtlı olarak geriye dönük uyumsuzdur. (Victor Stinner’ın bpo-36721 ‘deki katkısıyla.)

kendi kendini belgeleyen ifadeler ve hata ayıklama için f-dizeleri = desteği

f-strings için bir = tanımlayıcısı eklendi. f'{expr=}' gibi bir f-dizesi, ifade metnine, eşittir işaretine ve ardından değerlendirilen ifadenin temsiline genişler. Örneğin:

>>> user = 'eric_idle'
>>> member_since = date(1975, 7, 31)
>>> f'{user=} {member_since=}'
"user='eric_idle' member_since=datetime.date(1975, 7, 31)"

Her zamanki f-string biçim belirleyicileri, ifadenin sonucunun nasıl görüntülendiği üzerinde daha fazla kontrol sağlar:

>>> delta = date.today() - member_since
>>> f'{user=!s}  {delta.days=:,d}'
'user=eric_idle  delta.days=16,075'

= belirleyicisi, hesaplamaların gösterilebilmesi için ifadenin tamamını görüntüler:

>>> print(f'{theta=}  {cos(radians(theta))=:.3f}')
theta=30  cos(radians(theta))=0.866

(Eric V. Smith ve Larry Hastings’in bpo-36817 ‘deki katkılarıyla.)

PEP 578: Python Çalışma Zamanı Denetim Kancaları

PEP, Denetim Kancası ve Doğrulanmış Açık Kanca ekler. Her ikisi de Python ve yerel koddan edinilebilir, saf Python kodunda yazılmış uygulamaların ve çerçevelerin ekstra bildirimlerden yararlanmasına izin verirken, aynı zamanda gömücülerin veya sistem yöneticilerinin denetimin her zaman etkin olduğu Python yapılarını dağıtmasına izin verir.

Tüm ayrıntılar için bkz. PEP 578.

PEP 587: Python Başlatma Yapılandırması

PEP 587, tüm yapılandırma üzerinde daha hassas kontrol ve daha iyi hata raporlama sağlayan Python Başlatmayı yapılandırmak için yeni bir C API ekler.

Yeni yapılar:

Yeni fonksiyonlar:

Bu PEP ayrıca bu iç yapılara _PyRuntimeState.preconfig (PyPreConfig type) ve PyInterpreterState.config (PyConfig type) alanlarını ekler. PyInterpreterState.config, global yapılandırma değişkenlerinin ve diğer özel değişkenlerin yerini alarak yeni referans yapılandırması haline gelir.

Belgeler için Python Başlatma Yapılandırması konusuna bakın.

Tam açıklama için PEP 587 konusuna bakın.

(Victor Stinner’ın bpo-36763 ‘teki katkısıyla.)

PEP 590: Vectorcall: CPython için hızlı arama protokolü

Python/C API’sine The Vectorcall Protocol eklendi. Çeşitli sınıflar için zaten yapılmış olan mevcut optimizasyonları resmileştirmeyi amaçlamaktadır. Bir çağrılabilir uygulayan herhangi bir static type bu protokolü kullanabilir.

Bu şu anda geçicidir. Amaç, Python 3.9 ‘da tamamen halka açık hale getirmektir.

Tam açıklama için PEP 590 ‘a bakın.

(Jeroen Demeyer, Mark Shannon ve Petr Viktorin’in katkılarıyla bpo-36974.)

Bant dışı veri tamponlarıyla Pickle protokolü 5

Çok çekirdekli veya çok makineli işlemeden yararlanmak amacıyla Python süreçleri arasında büyük verileri aktarmak için pickle kullanıldığında, bellek kopyalarını azaltarak ve muhtemelen veriye bağlı sıkıştırma gibi özel teknikler uygulayarak aktarımı optimize etmek önemlidir.

pickle protokolü 5, PEP 3118 uyumlu verilerin iletişim katmanının takdirine bağlı olarak ana pickle akışından ayrı olarak iletilebildiği bant dışı tamponlar için destek sunar.

Tam açıklama için PEP 574 ‘e bakın.

(Antoine Pitrou’nun bpo-36785 ‘teki katkısıyla.)

Diğer Dil Değişiklikleri

  • Bir continue ifadesi, uygulamadaki bir sorun nedeniyle finally cümlesinde yasadışı idi. Python 3.8’de bu kısıtlama kaldırıldı. (Serhiy Storchaka’nın bpo-32489 ‘daki katkısıyla.)

  • bool, int ve fractions.Fraction türleri artık float ve decimal.Decimal türlerinde olduğu gibi bir as_integer_ratio() yöntemine sahiptir. Bu küçük API uzantısı numerator, denominator = x.as_integer_ratio() yazmayı ve bunun birden fazla sayısal türde çalışmasını mümkün kılmaktadır. (Lisa Roach tarafından bpo-33073 ve Raymond Hettinger tarafından bpo-37819 ile katkıda bulunulmuştur)

  • int, float ve complex kurucuları artık __index__() özel yöntemini kullanacak, eğer mevcutsa ve ilgili yöntem __int__(), __float__() veya mevcut değilse __complex__() . (Serhiy Storchaka’nın bpo-20092 ‘deki katkısıyla.)

  • Added support of \N{name} escapes in regular expressions:

    >>> notice = 'Copyright © 2019'
    >>> copyright_year_pattern = re.compile(r'\N{copyright sign}\s*(\d{4})')
    >>> int(copyright_year_pattern.search(notice).group(1))
    2019
    

    (Jonathan Eunice ve Serhiy Storchaka tarafından bpo-30688 ‘de katkıda bulunulmuştur.)

  • Dict ve dictviews artık reversed() kullanılarak tersine çevrilmiş ekleme sırasına göre yinelenebilir. (Rémi Lapeyre’nin bpo-33462 ‘deki katkısıyla.)

  • Fonksiyon çağrılarında anahtar kelime isimleri için izin verilen sözdizimi daha da kısıtlandı. Özellikle, f((keyword)=arg) ifadesine artık izin verilmemektedir. Bir anahtar kelime argüman atama teriminin sol tarafında çıplak bir isimden daha fazlasına izin verilmesi asla amaçlanmamıştır. (Benjamin Peterson’un bpo-34641 ‘deki katkısıyla.)

  • yield ve return ifadelerinde genelleştirilmiş yinelenebilir paket açma artık parantez içine alma gerektirmez. Bu, yield ve return sözdizimini normal atama sözdizimiyle daha iyi uyumlu hale getirir:

    >>> def parse(family):
            lastname, *members = family.split()
            return lastname.upper(), *members
    
    >>> parse('simpsons homer marge bart lisa maggie')
    ('SIMPSONS', 'homer', 'marge', 'bart', 'lisa', 'maggie')
    

    (David Cuthbert ve Jordan Chapman’ın bpo-32117 ‘deki katkılarıyla.)

  • [(10, 20) (30, 40)] gibi bir kodda virgül atlandığında, derleyici yardımcı bir öneriyle birlikte bir SyntaxWarning görüntüler. Bu, sadece ilk tuple’ın çağrılabilir olmadığını belirten bir TypeError olmasıyla gelişir. (Serhiy Storchaka’nın bpo-15248 ‘deki katkısıyla.)

  • datetime.date veya datetime.datetime ve datetime.timedelta nesnelerinin alt sınıfları arasındaki aritmetik işlemler artık temel sınıf yerine alt sınıfın bir örneğini döndürmektedir. Bu, astimezone() gibi uygulaması (doğrudan veya dolaylı olarak) datetime.timedelta aritmetiğini kullanan işlemlerin dönüş türünü de etkiler. (Paul Ganssle tarafından bpo-32417 ile katkıda bulunulmuştur)

  • Python yorumlayıcısı Ctrl-C (SIGINT) tarafından kesintiye uğradığında ve ortaya çıkan KeyboardInterrupt istisnası yakalanmadığında, Python işlemi artık bir SIGINT sinyali ile veya çağıran işlemin Ctrl-C nedeniyle öldüğünü algılayabileceği şekilde doğru çıkış koduyla çıkar. POSIX ve Windows üzerindeki kabuklar, etkileşimli oturumlardaki komut dosyalarını düzgün bir şekilde sonlandırmak için bunu kullanır. (Google tarafından Gregory P. Smith aracılığıyla bpo-1054041 ‘de katkıda bulunulmuştur)

  • Bazı gelişmiş programlama stilleri, mevcut bir fonksiyon için types.CodeType nesnesinin güncellenmesini gerektirir. Kod nesneleri değişmez olduğundan, mevcut kod nesnesini model alan yeni bir kod nesnesi oluşturulması gerekir. 19 parametre ile bu biraz sıkıcıydı. Şimdi, yeni replace() yöntemi, birkaç değiştirilmiş parametre ile bir klon oluşturmayı mümkün kılıyor.

    İşte statistics.mean() fonksiyonunu değiştirerek data parametresinin bir anahtar kelime argümanı olarak kullanılmasını engelleyen bir örnek:

    >>> from statistics import mean
    >>> mean(data=[10, 20, 90])
    40
    >>> mean.__code__ = mean.__code__.replace(co_posonlyargcount=1)
    >>> mean(data=[10, 20, 90])
    Traceback (most recent call last):
      ...
    TypeError: mean() got some positional-only arguments passed as keyword arguments: 'data'
    

    (Victor Stinner’ın bpo-37032 ‘deki katkısıyla.)

  • Tamsayılar için, pow() fonksiyonunun üç argümanlı formu artık tabanın modüle göre asal olduğu durumda üssün negatif olmasına izin vermektedir. Daha sonra, üs -1 olduğunda tabanın modüler bir tersini ve diğer negatif üsler için bu tersin uygun bir kuvvetini hesaplar. Örneğin, 38 modulo 137`nin modüler çarpımsal tersini hesaplamak için şunu yazın:

    >>> pow(38, -1, 137)
    119
    >>> 119 * 38 % 137
    1
    

    Modüler tersler, lineer Diophantine denklemlerinin çözümünde ortaya çıkar. Örneğin, 4258𝑥 + 147𝑦 = 369 tamsayı çözümlerini bulmak için, önce 4258𝑥 369 (mod 147) olarak yeniden yazın ve sonra çözün:

    >>> x = 369 * pow(4258, -1, 147) % 147
    >>> y = (4258 * x - 369) // -147
    >>> 4258 * x + 147 * y
    369
    

    (Mark Dickinson’ın tarafından bpo-36027 ‘deki katkısıyla.)

  • Dict kavramaları dict değişmezleri ile senkronize edilmiştir, böylece anahtar ilk olarak ve değer ikinci olarak hesaplanır:

    >>> # Dict comprehension
    >>> cast = {input('role? '): input('actor? ') for i in range(2)}
    role? King Arthur
    actor? Chapman
    role? Black Knight
    actor? Cleese
    
    >>> # Dict literal
    >>> cast = {input('role? '): input('actor? ')}
    role? Sir Robin
    actor? Eric Idle
    

    Garantili yürütme sırası atama ifadelerinde yardımcı olur çünkü anahtar ifadesinde atanan değişkenler değer ifadesinde kullanılabilir olacaktır:

    >>> names = ['Martin von Löwis', 'Łukasz Langa', 'Walter Dörwald']
    >>> {(n := normalize('NFC', name)).casefold() : n for name in names}
    {'martin von löwis': 'Martin von Löwis',
     'łukasz langa': 'Łukasz Langa',
     'walter dörwald': 'Walter Dörwald'}
    

    (Jörn Heissler’ın bpo-35224 ‘teki katkısıyla.)

  • object.__reduce__() yöntemi artık iki ila altı eleman uzunluğunda bir tuple döndürebilir. Eskiden sınır beşti. Yeni, isteğe bağlı altıncı eleman (obj, state) imzasına sahip bir çağrılabilirdir. Bu, belirli bir nesnenin durum güncelleme davranışı üzerinde doğrudan kontrol sağlar. Eğer None değilse, bu çağrılabilir öğe nesnenin __setstate__() yöntemine göre önceliğe sahip olacaktır. (Pierre Glaser ve Olivier Grisel’in bpo-35900 ‘deki katkılarıyla.)

Yeni Modüller

  • Yeni importlib.metadata modülü, üçüncü taraf paketlerden meta verileri okumak için (geçici) destek sağlar. Örneğin, yüklü bir paketin sürüm numarasını, giriş noktalarının listesini ve daha fazlasını çıkarabilir:

    >>> # Note following example requires that the popular "requests"
    >>> # package has been installed.
    >>>
    >>> from importlib.metadata import version, requires, files
    >>> version('requests')
    '2.22.0'
    >>> list(requires('requests'))
    ['chardet (<3.1.0,>=3.0.2)']
    >>> list(files('requests'))[:5]
    [PackagePath('requests-2.22.0.dist-info/INSTALLER'),
     PackagePath('requests-2.22.0.dist-info/LICENSE'),
     PackagePath('requests-2.22.0.dist-info/METADATA'),
     PackagePath('requests-2.22.0.dist-info/RECORD'),
     PackagePath('requests-2.22.0.dist-info/WHEEL')]
    

    (Barry Warsaw ve Jason R. Coombs’un bpo-34632 ‘deki katkılarıyla.)

Geliştirilmiş Modüller

ast

AST düğümleri artık düğümün sonunun kesin konumunu veren end_lineno ve end_col_offset niteliklerine sahiptir. (Bu sadece lineno ve col_offset niteliklerine sahip düğümler için geçerlidir)

Yeni fonksiyon ast.get_source_segment() belirli bir AST düğümü için kaynak kodunu döndürür.

(Ivan Levkivskyi’nin bpo-33416 ‘daki katkısıyla.)

ast.parse() fonksiyonu bazı yeni bayraklara sahiptir:

  • type_comments=True , belirli AST düğümleriyle ilişkili PEP 484 ve PEP 526 tipi yorumların metnini döndürmesine neden olur;

  • mode='func_type', PEP 484 “imza tipi yorumlarını” (fonksiyon tanımı AST düğümleri için döndürülür) ayrıştırmak için kullanılabilir;

  • feature_version=(3, N) daha önceki bir Python 3 sürümünü belirtmeye izin verir. Örneğin, feature_version=(3, 4), async ve await sözcüklerini rezerve edilmemiş sözcükler olarak ele alacaktır.

(Guido van Rossum’un bpo-35766 ‘daki katkısıyla.)

asyncio

asyncio.run() geçici API’den kararlı API’ye geçiş yaptı. Bu fonksiyon, bir coroutine yürütmek ve olay döngüsünü otomatik olarak yönetirken sonucu döndürmek için kullanılabilir. Örneğin:

import asyncio

async def main():
    await asyncio.sleep(0)
    return 42

asyncio.run(main())

Bu, kabaca şuna eşdeğerdir:

import asyncio

async def main():
    await asyncio.sleep(0)
    return 42

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try:
    loop.run_until_complete(main())
finally:
    asyncio.set_event_loop(None)
    loop.close()

Gerçek uygulama önemli ölçüde daha karmaşıktır. Bu nedenle, asyncio.run() asyncio programlarını çalıştırmak için tercih edilen yol olmalıdır.

(Yury Selivanov’un bpo-32314 ‘teki katkısıyla.)

python -m asyncio çalıştırıldığında yerel bir async REPL başlatılır. Bu, üst düzey bir await içeren kodla hızlı denemeler yapılmasına olanak tanır. Artık her çağrıda yeni bir olay döngüsü oluşturacak asyncio.run() fonksiyonunu doğrudan çağırmaya gerek yoktur:

$ python -m asyncio
asyncio REPL 3.8.0
Use "await" directly instead of "asyncio.run()".
Type "help", "copyright", "credits" or "license" for more information.
>>> import asyncio
>>> await asyncio.sleep(10, result='hello')
hello

(Yury Selivanov’un bpo-37028 ‘deki katkısıyla.)

İstisna asyncio.CancelledError artık Exception yerine BaseException ‘dan miras alıyor ve artık concurrent.futures.CancelledError ‘dan miras almıyor. (Yury Selivanov’un bpo-32528 ‘deki katkısıyla.)

Windows’ta, varsayılan olay döngüsü artık ProactorEventLoop şeklindedir. (Victor Stinner’ın bpo-34687 ‘deki katkısıyla.)

ProactorEventLoop artık UDP’yi de destekliyor. (Adam Meily ve Andrew Svetlov’ın bpo-29883 ‘teki katkılarıyla.)

ProactorEventLoop artık KeyboardInterrupt (“CTRL+C”) ile kesilebilir. (Vladimir Matveev’in bpo-23057 ‘deki katkısıyla.)

Bir asyncio.Task içindeki sarılmış korutini almak için asyncio.Task.get_coro() eklendi. (Alex Grönholm’ın bpo-36999 ‘daki katkısıyla.)

Asyncio görevleri artık asyncio.create_task() veya create_task() olay döngüsü yöntemine name anahtar sözcük argümanı geçirilerek ya da görev nesnesi üzerinde set_name() yöntemi çağrılarak adlandırılabilir. Görev adı asyncio.Task metodunun repr() çıktısında görülebilir ve get_name() metodu kullanılarak da alınabilir. (Alex Grönholm’ın bpo-34270 ‘teki katkısıyla.)

asyncio.loop.create_connection() ‘a Happy Eyeballs desteği eklendi. Davranışı belirtmek için iki yeni parametre eklendi: happy_eyeballs_delay ve interleave. Happy Eyeballs algoritması, IPv4 ve IPv6’yı destekleyen uygulamalarda, her ikisini de kullanarak aynı anda bağlanmaya çalışarak yanıt verebilirliği artırır. (twisteroid ambassador’un bpo-33530 ‘daki katkısıyla.)

builtins

compile() yerleşik yapısı ast.PyCF_ALLOW_TOP_LEVEL_AWAIT bayrağını kabul edecek şekilde geliştirilmiştir. Bu yeni bayrak geçildiğinde, compile() genellikle geçersiz sözdizimi olarak kabul edilen üst düzey await, async for ve async with yapılarına izin verecektir. Daha sonra CO_COROUTINE bayrağı ile işaretlenmiş asenkron kod nesnesi döndürülebilir. (Matthias Bussonnier’ın bpo-34616 ‘daki katkısıyla.)

collections

collections.namedtuple() için _asdict() yöntemi artık collections.OrderedDict yerine bir dict döndürüyor. Bu işe yarıyor çünkü normal dictler Python 3.7’den beri garantili sıralamaya sahip. Eğer OrderedDict ‘in ekstra özellikleri gerekiyorsa, önerilen çözüm sonucu istenen türe dönüştürmektir: OrderedDict(nt._asdict()). (Raymond Hettinger’ın bpo-35864 ‘teki katkısıyla.)

cProfile

cProfile.Profile sınıfı artık bir bağlam yöneticisi olarak kullanılabilir. Çalıştırarak bir kod bloğunun profilini oluşturun:

import cProfile

with cProfile.Profile() as profiler:
      # code to be profiled
      ...

(Scott Sanderson’ın bpo-29235 ‘teki katkısıyla.)

csv

csv.DictReader artık collections.OrderedDict yerine dict örneklerini döndürüyor. Araç artık daha hızlı ve alan sırasını korurken daha az bellek kullanıyor. (Michael Selik’ in bpo-34003 ‘teki katkısıyla.)

curses

Temel ncurses kütüphanesi için yapılandırılmış sürüm bilgilerini tutan yeni bir değişken eklendi: ncurses_version. (Serhiy Storchaka’nın bpo-31680 ‘deki katkısıyla.)

ctypes

Windows üzerinde, CDLL ve alt sınıfları artık temel LoadLibraryEx çağrısı için bayrakları belirtmek üzere bir winmode parametresi kabul etmektedir. Varsayılan bayraklar, DLL’nin depolandığı yol (ilk DLL’yi yüklemek için tam veya kısmi bir yol kullanılmışsa) ve add_dll_directory() tarafından eklenen yollar dahil olmak üzere, yalnızca güvenilir konumlardan DLL bağımlılıklarını yükleyecek şekilde ayarlanmıştır. (Steve Dower’ın bpo-36085 ‘teki katkısıyla.)

datetime

Added new alternate constructors datetime.date.fromisocalendar() and datetime.datetime.fromisocalendar(), which construct date and datetime objects respectively from ISO year, week number, and weekday; these are the inverse of each class’s isocalendar method. (Contributed by Paul Ganssle in bpo-36004.)

functools

functools.lru_cache() artık bir dekoratör döndüren bir fonksiyon yerine düz bir dekoratör olarak kullanılabilir. Yani bunların ikisi de artık destekleniyor:

@lru_cache
def f(x):
    ...

@lru_cache(maxsize=256)
def f(x):
    ...

(Raymond Hettinger’ın bpo-36772 ‘deki katkısıyla.)

Örneğin ömrü boyunca önbelleğe alınan hesaplanmış özellikler için yeni bir functools.cached_property() dekoratörü eklendi:

import functools
import statistics

class Dataset:
   def __init__(self, sequence_of_numbers):
      self.data = sequence_of_numbers

   @functools.cached_property
   def variance(self):
      return statistics.variance(self.data)

(Carl Meyer’ın bpo-21145 ‘teki katkısıyla.)

Metotları single dispatch kullanarak generic functions haline dönüştüren yeni bir functools.singledispatchmethod() dekoratörü eklendi:

from functools import singledispatchmethod
from contextlib import suppress

class TaskManager:

    def __init__(self, tasks):
        self.tasks = list(tasks)

    @singledispatchmethod
    def discard(self, value):
        with suppress(ValueError):
            self.tasks.remove(value)

    @discard.register(list)
    def _(self, tasks):
        targets = set(tasks)
        self.tasks = [x for x in self.tasks if x not in targets]

(Ethan Smith’in bpo-32380 ‘deki katkısıyla)

gc

get_objects() artık nesnelerin alınacağı nesli belirten isteğe bağlı bir nesil parametresi alabilir. (Pablo Galindo’nun bpo-36016 ‘daki katkılarıyla.)

gettext

pgettext() ve varyantları eklendi. (Franz Glasner, Éric Araujo ve Cheryl Sabella’nın bpo-2504 ‘teki katkılarıyla.)

gzip

Tekrarlanabilir çıktı için gzip.compress() dosyasına mtime parametresi eklendi. (Guo Ci Teo’nun bpo-34898 ‘deki katkılarıyla.)

Belirli türdeki geçersiz veya bozuk gzip dosyaları için OSError yerine artık BadGzipFile istisnası oluşturulmaktadır. (Filip Gruszczyński, Michele Orrù ve Zackery Spytz’in bpo-6584 ‘teki katkılarıyla.)

IDLE ve idlelib

N satırın üzerindeki çıktı (varsayılan olarak 50) bir düğmeye sıkıştırılır. N, Ayarlar iletişim kutusunun Genel sayfasının PyShell bölümünde değiştirilebilir. Daha az, ancak muhtemelen ekstra uzun satırlar, çıktıya sağ tıklanarak sıkıştırılabilir. Sıkıştırılmış çıktı, düğmeye çift tıklanarak yerinde veya düğmeye sağ tıklanarak panoya veya ayrı bir pencereye genişletilebilir. (Tal Einat’ın bpo-1529353 ‘teki katkısıyla.)

Bir modülü özelleştirilmiş ayarlarla çalıştırmak için Çalıştır menüsüne “Özelleştirilmiş Çalıştır” seçeneğini ekleyin. Girilen tüm komut satırı argümanları sys.argv’ye eklenir. Ayrıca bir sonraki özelleştirilmiş çalıştırma için kutuda yeniden görünürler. Ayrıca normal Shell ana modülünün yeniden başlatılması da engellenebilir. (Cheryl Sabella, Terry Jan Reedy ve diğerleri tarafından bpo-5680 ve bpo-37627 ‘de katkıda bulunulmuştur)

IDLE düzenleyici pencereleri için isteğe bağlı satır numaraları eklendi. Yapılandırma iletişim kutusunun Genel sekmesinde aksi ayarlanmadığı sürece pencereler satır numaraları olmadan açılır. Mevcut bir pencere için satır numaraları Seçenekler menüsünde gösterilir ve gizlenir. (Tal Einat ve Saimadhav Heblikar’ın bpo-17535 ‘teki katkılarıyla.)

OS yerel kodlaması artık Python dizeleri ve Tcl nesneleri arasında dönüştürme yapmak için kullanılıyor. Bu, IDLE’ın emoji ve diğer BMP olmayan karakterlerle çalışmasını sağlar. Bu karakterler görüntülenebilir veya kopyalanıp panoya veya panodan yapıştırılabilir. Dizeleri Tcl’den Python’a ve geri dönüştürmek artık asla başarısız olmuyor. (Birçok kişi sekiz yıl boyunca bunun üzerinde çalıştı ancak sorun sonunda Serhiy Storchaka tarafından bpo-13153 ‘de çözüldü)

3.8.1’deki yenilikler:

İmleç yanıp sönmesini kapatmak için seçenek ekleyin. (Zackery Spytz’in bpo-4603 ‘teki katkısıyla.)

Escape tuşu artık IDLE tamamlama pencerelerini kapatıyor. (Johnny Najera’nın bpo-38944 ‘teki katkısıyla.)

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

Modül adı tamamlama listesine anahtar kelimeler ekleyin. (Terry J. Reedy’nin bpo-37765 ‘teki katkısıyla.)

inspect

inspect.getdoc() fonksiyonu artık __slots__ için doktrin bulabilir, eğer bu nitelik değerlerin doktrin olduğu bir dict ise. Bu, property(), classmethod() ve staticmethod() için zaten sahip olduğumuza benzer doktrin seçenekleri sağlar:

class AudioClip:
    __slots__ = {'bit_rate': 'expressed in kilohertz to one decimal place',
                 'duration': 'in seconds, rounded up to an integer'}
    def __init__(self, bit_rate, duration):
        self.bit_rate = round(bit_rate / 1000.0, 1)
        self.duration = ceil(duration)

(Raymond Hettinger’ın bpo-36326 ‘daki katkısıyla.)

io

Geliştirme modunda (-X env) ve debug build içinde, io.IOBase sonlandırıcısı artık close() yöntemi başarısız olursa istisnayı kaydeder. Sürüm derlemesinde istisna varsayılan olarak sessizce yok sayılır. (Victor Stinner’ın bpo-18748 ‘deki katkısıyla.)

itertools

itertools.accumulate() fonksiyonuna bir başlangıç değeri belirtmek için initial anahtar kelime argümanı seçeneği eklendi:

>>> from itertools import accumulate
>>> list(accumulate([10, 5, 30, 15], initial=1000))
[1000, 1010, 1015, 1045, 1060]

(Lisa Roach’un bpo-34659 ‘daki katkısıyla.)

json.tool

Her girdi satırını ayrı bir JSON nesnesi olarak ayrıştırmak için --json-lines seçeneğini ekleyin. (Weipeng Hong’un bpo-31553 ‘teki katkısıyla.)

kayıt tutma

logging.basicConfig() fonksiyonuna bir force anahtar kelime argümanı eklendi. Doğru olarak ayarlandığında, diğer argümanlarla belirtilen yapılandırma gerçekleştirilmeden önce kök kaydediciye bağlı mevcut işleyiciler kaldırılır ve kapatılır.

Bu, uzun süredir devam eden bir sorunu çözmektedir. Bir kaydedici veya basicConfig() çağrıldıktan sonra, basicConfig() ‘e yapılan sonraki çağrılar sessizce yok sayılıyordu. Bu durum, etkileşimli komut istemini veya Jupyter not defterini kullanarak çeşitli kaydedici yapılandırma seçeneklerini güncellemeyi, denemeyi veya öğretmeyi zorlaştırıyordu.

(Suggested by Raymond Hettinger, implemented by Donghee Na, and reviewed by Vinay Sajip in bpo-33897.)

math

İki nokta arasındaki Öklid mesafesini hesaplamak için yeni math.dist() fonksiyonu eklendi. (Raymond Hettinger’ın bpo-33089 ‘daki katkısıyla.)

math.hypot() fonksiyonu çoklu boyutları işleyecek şekilde genişletildi. Önceden sadece 2 boyutlu durumu destekliyordu. (Raymond Hettinger’ın bpo-33089 ‘daki katkısıyla.)

Yeni math.prod() fonksiyonu eklendi, sum() fonksiyonuna benzer bir fonksiyon olarak, bir ‘başlangıç’ değeri (varsayılan: 1) ile bir sayı yinelenebilirinin çarpımını döndürür:

>>> prior = 0.8
>>> likelihoods = [0.625, 0.84, 0.30]
>>> math.prod(likelihoods, start=prior)
0.126

(Pablo Galindo’nun bpo-35606 ‘daki katkısıyla.)

İki yeni kombinatorik fonksiyon eklendi math.perm() ve math.comb():

>>> math.perm(10, 3)    # Permutations of 10 things taken 3 at a time
720
>>> math.comb(10, 3)    # Combinations of 10 things taken 3 at a time
120

(Yash Aggarwal, Keller Fuchs, Serhiy Storchaka ve Raymond Hettinger’ın bpo-37128, bpo-37178 ve bpo-35431 ‘deki katkılarıyla.)

Kayan noktaya dönüştürmeden doğru tamsayı kareköklerini hesaplamak için yeni bir math.isqrt() fonksiyonu eklendi. Yeni fonksiyon keyfi olarak büyük tamsayıları destekler. Bu fonksiyon floor(sqrt(n)) fonksiyonundan daha hızlıdır ancak math.sqrt(): fonksiyonundan daha yavaştır:

>>> r = 650320427
>>> s = r ** 2
>>> isqrt(s - 1)         # correct
650320426
>>> floor(sqrt(s - 1))   # incorrect
650320427

(Mark Dickinson’ın bpo-36887 ‘deki katkısıyla.)

Fonksiyon math.factorial() artık int benzeri olmayan argümanları kabul etmiyor. (Pablo Galindo’nun bpo-33083 ‘deki katkısıyla)

mmap

mmap.mmap sınıfı artık madvise() sistem çağrısına erişmek için bir madvise() yöntemine sahiptir. (Zackery Spytz’in bpo-32941 ‘deki katkısıyla.)

multiprocessing

Yeni multiprocessing.shared_memory modülü eklendi. (Davin Potts’un bpo-35813 ‘deki katkısıyla.)

macOS’ta spawn başlatma yöntemi artık varsayılan olarak kullanılmaktadır. (Victor Stinner’ın bpo-33725 ‘teki katkısıyla.)

os

Eklenti modüllerini içe aktarırken veya ctypes kullanarak DLL’leri yüklerken yerel bağımlılıklar için ek arama yolları sağlamak için Windows’ta yeni add_dll_directory() fonksiyonu eklendi. (Steve Dower’ın bpo-36085 ‘teki katkısıyla.)

Yeni bir os.memfd_create() fonksiyonu memfd_create() sistem çağrısını sarmak için eklendi. (Zackery Spytz ve Christian Heimes tarafından bpo-26836 ‘daki katkısıyla.)

Windows’ta, yeniden ayrıştırma noktalarını (sembolik bağlantılar ve dizin bağlantıları dahil) işlemek için manuel mantığın çoğu işletim sistemine devredilmiştir. Özellikle, os.stat() artık işletim sistemi tarafından desteklenen her şeyi geçerken, os.lstat() yalnızca “isim vekilleri” olarak tanımlanan yeniden ayrıştırma noktalarını açacak, diğerleri ise os.stat() için olduğu gibi açılacaktır. Her durumda, stat_result.st_mode sadece sembolik bağlantılar için S_IFLNK ayarına sahip olacak, diğer türdeki ayrıştırma noktaları için olmayacaktır. Diğer yeniden ayrıştırma noktası türlerini tanımlamak için yeni stat_result.st_reparse_tag niteliğini kontrol edin.

Windows üzerinde, os.readlink() artık dizin bağlantılarını okuyabilmektedir. islink() dizin bağlantıları için False döndürecektir ve bu nedenle önce islink kontrol eden kod bağlantıları dizin olarak ele almaya devam ederken, os.readlink() hatalarını işleyen kod artık bağlantıları linkler olarak ele alabilir.

(Steve Dower’ın bpo-37834 ‘teki katkısıyla.)

os.path

exists(), lexists(), isdir(), isfile(), islink() ve ismount() gibi boolean sonuç döndüren os.path fonksiyonları artık işletim sistemi düzeyinde temsil edilemeyen karakterler veya baytlar içeren yollar için ValueError veya alt sınıfları UnicodeEncodeError ve UnicodeDecodeError yerine False döndürüyor. (Serhiy Storchaka’nın bpo-33721 ‘deki katkısıyla.)

Windows üzerinde expanduser() artık USERPROFILE ortam değişkenini tercih ediyor ve normalde normal kullanıcı hesapları için ayarlanmamış olan HOME değişkenini kullanmıyor. (Anthony Sottile’nin bpo-36264 ‘deki katkısıyla.)

isdir() Windows üzerinde artık var olmayan bir dizine bağlantı için True döndürmüyor.

Windows üzerinde realpath() artık ortak bağlantılar ve dizin birleşimleri de dahil olmak üzere yeniden ayrıştırma noktalarını çözümlüyor.

(Steve Dower’ın bpo-37834 ‘teki katkısıyla.)

pathlib

exists(), is_dir(), is_file(), is_mount(), is_symlink(), is_block_device(), is_char_device(), is_fifo(), is_socket() gibi boolean sonuç döndüren pathlib.Path metotları artık işletim sistemi seviyesinde temsil edilemeyen karakterler içeren yollar için ValueError veya alt sınıfı UnicodeEncodeError yükseltmek yerine False döndürüyor. (Serhiy Storchaka’nın bpo-33721 ‘deki katkısıyla.)

Added pathlib.Path.link_to() which creates a hard link pointing to a path. (Contributed by Joannah Nanjekye in bpo-26978) Note that link_to was deprecated in 3.10 and removed in 3.12 in favor of a hardlink_to method added in 3.10 which matches the semantics of the existing symlink_to method.

pickle

C-optimized Pickler alt sınıfını kullanan pickle uzantıları artık özel reducer_override() yöntemini tanımlayarak fonksiyon ve sınıfların pickling mantığını geçersiz kılabilir. (Pierre Glaser ve Olivier Grisel’ın bpo-35900 ‘deki katkılarıyla.)

plistlib

Yeni plistlib.UID eklendi ve NSKeyedArchiver ile kodlanmış ikili plistleri okuma ve yazma desteği etkinleştirildi. (Jon Janzen tarafından bpo-26707 ‘deki katkısıyla.)

pprint

pprint modülü çeşitli fonksiyonlara sort_dicts parametresi ekledi. Varsayılan olarak, bu fonksiyonlar sözlükleri oluşturmadan veya yazdırmadan önce sıralamaya devam eder. Ancak, sort_dicts yanlış olarak ayarlanırsa, sözlükler anahtarların eklendiği sırayı korur. Bu, hata ayıklama sırasında JSON girdileriyle karşılaştırma yapmak için yararlı olabilir.

In addition, there is a convenience new function, pprint.pp() that is like pprint.pprint() but with sort_dicts defaulting to False:

>>> from pprint import pprint, pp
>>> d = dict(source='input.txt', operation='filter', destination='output.txt')
>>> pp(d, width=40)                  # Original order
{'source': 'input.txt',
 'operation': 'filter',
 'destination': 'output.txt'}
>>> pprint(d, width=40)              # Keys sorted alphabetically
{'destination': 'output.txt',
 'operation': 'filter',
 'source': 'input.txt'}

(Rémi Lapeyre’nin bpo-30670 ‘teki katkısıyla.)

py_compile

py_compile.compile() artık sessiz modu destekliyor. (Joannah Nanjekye’nin bpo-22640 ‘taki katkısıyla.)

shlex

Yeni shlex.join() fonksiyonu shlex.split() fonksiyonunun tersi gibi davranır. (Bo Bayles’in bpo-32102 ‘deki katkısıyla.)

shutil

shutil.copytree() artık yeni bir dirs_exist_ok anahtar kelime argümanını kabul ediyor. (Josh Bronson’ın bpo-20849 ‘daki katkısıyla.)

shutil.make_archive() artık taşınabilirliği ve standartlara uygunluğu artırmak için yeni arşivler için modern pax (POSIX.1-2001) formatını varsayılan olarak kullanmaktadır, tarfile modülündeki ilgili değişiklikten miras alınmıştır. (C.A.M. Gerlach’ın bpo-30661 ‘deki katkısıyla.)

windows üzerinde shutil.rmtree() artık dizin bağlantılarını önce içeriklerini özyinelemeli olarak kaldırmadan kaldırıyor. (Steve Dower’ın bpo-37834 ‘teki katkısıyla.)

socket

Aynı soket üzerinde hem IPv4 hem de IPv6 bağlantılarını kabul etmek de dahil olmak üzere bir sunucu soketi oluştururken genellikle gerekli görevleri otomatikleştirmek için create_server() ve has_dualstack_ipv6() kolaylık fonksiyonları eklendi. (Giampaolo Rodolà’nın bpo-17561 ‘deki katkısıyla.)

socket.if_nameindex(), socket.if_nametoindex() ve socket.if_indextoname() fonksiyonları Windows’ta uygulanmıştır. (Zackery Spytz’in bpo-37007 ‘deki katkısıyla.)

ssl

TLS 1.3 post-handshake kimlik doğrulamasını başlatmak için post_handshake_auth etkinleştirildi ve verify_client_post_handshake() eklendi. (Christian Heimes’in bpo-34670 ‘teki katkısıyla.)

statistics

Eklenen statistics.fmean(), statistics.mean() ‘in daha hızlı, kayan noktalı bir çeşididir. (Raymond Hettinger ve Steven D’Aprano ‘nun bpo-35904 ‘taki katkılarıyla.)

statistics.geometric_mean() eklendi (Raymond Hettinger’ın bpo-27181 ‘deki katkısıyla.)

En yaygın değerlerin bir listesini döndüren statistics.multimode() eklendi. (Raymond Hettinger’ın bpo-35892 ‘teki katkısıyla.)

Verileri veya bir dağılımı eşitlenebilir aralıklara (örneğin çeyrekler, ondalıklar veya yüzdelikler) bölen statistics.quantiles() eklendi. (Raymond Hettinger’ın bpo-36546 ‘teki katkısıyla.)

Rastgele bir değişkenin normal dağılımlarını oluşturmak ve işlemek için bir araç olan statistics.NormalDist eklendi. (Raymond Hettinger’ın bpo-36018 ‘deki katkısıyla. )

>>> temperature_feb = NormalDist.from_samples([4, 12, -3, 2, 7, 14])
>>> temperature_feb.mean
6.0
>>> temperature_feb.stdev
6.356099432828281

>>> temperature_feb.cdf(3)            # Chance of being under 3 degrees
0.3184678262814532
>>> # Relative chance of being 7 degrees versus 10 degrees
>>> temperature_feb.pdf(7) / temperature_feb.pdf(10)
1.2039930378537762

>>> el_niño = NormalDist(4, 2.5)
>>> temperature_feb += el_niño        # Add in a climate effect
>>> temperature_feb
NormalDist(mu=10.0, sigma=6.830080526611674)

>>> temperature_feb * (9/5) + 32      # Convert to Fahrenheit
NormalDist(mu=50.0, sigma=12.294144947901014)
>>> temperature_feb.samples(3)        # Generate random samples
[7.672102882379219, 12.000027119750287, 4.647488369766392]

sys

Yeni sys.unraisablehook() fonksiyonunu ekleyin, bu fonksiyon “kaldırılamayan istisnaların” nasıl işleneceğini kontrol etmek için geçersiz kılınabilir. Bir istisna oluştuğunda çağrılır, ancak Python’un bunu ele almasının bir yolu yoktur. Örneğin, bir yıkıcı bir istisna ortaya çıkardığında veya çöp toplama sırasında (gc.collect()). (Victor Stinner’ın bpo-36829 ‘daki katkısıyla.)

tarfile

tarfile modülü artık yeni arşivler için önceki GNU’ya özgü format yerine modern pax (POSIX.1-2001) formatını varsayılan olarak kullanmaktadır. Bu, standartlaştırılmış ve genişletilebilir bir formatta tutarlı bir kodlama (UTF-8) ile platformlar arası taşınabilirliği geliştirir ve başka avantajlar da sunar. (C.A.M. Gerlach’ın bpo-36268 ‘deki katkısıyla.)

threading

Yakalanmamış threading.Thread.run() istisnalarını işleyen yeni bir threading.excepthook() fonksiyonu ekleyin. Yakalanmamış threading.Thread.run() istisnalarının nasıl işleneceğini kontrol etmek için geçersiz kılınabilir. (Victor Stinner’ın bpo-1230540 ‘taki katkısıyla.)

Yeni bir threading.get_native_id() fonksiyonu ve native_id niteliğini threading.Thread sınıfına ekleyin. Bunlar, çekirdek tarafından atanan geçerli iş parçacığının yerel integral İş Parçacığı Kimliğini döndürür. Bu özellik yalnızca belirli platformlarda kullanılabilir, daha fazla bilgi için get_native_id bölümüne bakın. (Jake Tesler’ın bpo-36084 ‘teki katkısıyla.)

tokenize

tokenize modülü artık sonda yeni bir satır olmayan girdi sağlandığında örtük olarak bir NEWLINE belirteci yayar. Bu davranış artık C tokenizer’ın dahili olarak yaptığı ile eşleşiyor. (Ammar Askar’ın bpo-33899 ‘daki katkısıyla.)

tkinter

tkinter.Spinbox sınıfına selection_from(), selection_present(), selection_range() ve selection_to() yöntemleri eklendi. (Juliette Monsel’ın bpo-34829 ‘daki katkısıyla.)

tkinter.Canvas sınıfına moveto() metodu eklendi. (Juliette Monsel’ın bpo-23831 ‘deki katkısıyla.)

tkinter.PhotoImage sınıfı artık transparency_get() ve transparency_set() yöntemlerine sahiptir. (Zackery Spytz’in bpo-25451 ‘deki katkısıyla.)

time

Added new clock CLOCK_UPTIME_RAW for macOS 10.12. (Contributed by Joannah Nanjekye in bpo-35702.)

typing

typing modülü birkaç yeni özellik içerir:

  • Anahtar başına türleri olan bir sözlük türü. Bakınız PEP 589 ve typing.TypedDict. TypedDict yalnızca dize anahtarları kullanır. Varsayılan olarak, her anahtarın mevcut olması gerekir. Anahtarların isteğe bağlı olmasına izin vermek için “total=False” belirtin:

    class Location(TypedDict, total=False):
        lat_long: tuple
        grid_square: str
        xy_coordinate: tuple
    
  • Değişmez tipler. Bakınız PEP 586 ve typing.Literal. Değişmez tipler, bir parametrenin veya dönüş değerinin bir veya daha fazla belirli değişmez değerle sınırlandırıldığını gösterir:

    def get_status(port: int) -> Literal['connected', 'disconnected']:
        ...
    
  • “Final” değişkenler, fonksiyonlar, metotlar ve sınıflar. Bakınız PEP 591, typing.Final ve typing.final(). Final niteleyicisi statik tip denetleyicisine alt sınıflamayı, geçersiz kılmayı veya yeniden atamayı kısıtlama talimatı verir:

    pi: Final[float] = 3.1415926536
    
  • Protokol tanımları. Bakınız PEP 544, typing.Protocol ve typing.runtime_checkable(). typing.SupportsInt gibi basit ABC’ler artık Protocol alt sınıflarıdır.

  • Yeni protokol sınıfı typing.SupportsIndex.

  • Yeni fonksiyonlar typing.get_origin() ve typing.get_args().

unicodedata

unicodedata modülü Unicode 12.1.0 sürümünü kullanacak şekilde yükseltildi.

Yeni is_normalized() fonksiyonu, bir dizenin belirli bir normal formda olduğunu doğrulamak için kullanılabilir, genellikle dizeyi gerçekten normalleştirmekten çok daha hızlıdır. (Max Belanger, David Euresti ve Greg Price’ın bpo-32285 ve bpo-37966 ‘daki katkılarıyla).

unittest

Eklenen AsyncMock, Mock ‘un asenkron versiyonunu desteklemektedir. Test için uygun yeni savunma fonksiyonları da eklenmiştir. (Lisa Roach’ın bpo-26467 ‘deki katkısıyla.)

Unitteste setUpModule() ve setUpClass() için temizleme işlemlerini desteklemek üzere addModuleCleanup() ve addClassCleanup() eklendi. (Lisa Roach ‘un bpo-24412 ‘deki katkısıyla.)

Birkaç sahte savunma fonksiyonu artık başarısızlık durumunda gerçek çağrıların bir listesini de yazdırıyor. (Petter Strandmark’ın bpo-35047 ‘deki katkısıyla.)

unittest modülü, unittest.IsolatedAsyncioTestCase ile test durumları olarak kullanılacak korutinler için destek kazandı. (Andrew Svetlov’un bpo-32972 ‘deki katkısıyla.)

Örnek:

import unittest


class TestRequest(unittest.IsolatedAsyncioTestCase):

    async def asyncSetUp(self):
        self.connection = await AsyncConnection()

    async def test_get(self):
        response = await self.connection.get("https://example.com")
        self.assertEqual(response.status_code, 200)

    async def asyncTearDown(self):
        await self.connection.close()


if __name__ == "__main__":
    unittest.main()

venv

venv artık PowerShell Core 6.1 altında sanal ortamları etkinleştirmek için tüm platformlarda bir Activate.ps1 dizesi içeriyor (Brett Cannon’un bpo-32718 ‘deki katkısıyla.)

weakref

weakref.proxy() tarafından döndürülen proxy nesneleri artık diğer sayısal operatörlere ek olarak @ ve @= matris çarpma operatörlerini de desteklemektedir. (Mark Dickinson’ın bpo-36669 ‘daki katkısıyla.)

xml

DTD ve harici varlık alımına karşı hafifletme olarak, xml.dom.minidom ve xml.sax modülleri artık varsayılan olarak harici varlıkları işlememektedir. (Christian Heimes’ın bpo-17239 ‘daki katkısıyla.)

xml.etree.ElementTree modülündeki .find*() yöntemleri, ad alanını yok sayan {*}tag ve verilen ad alanındaki tüm etiketleri döndüren {namespace}* gibi joker karakter aramalarını destekler. (Stefan Behnel’ın bpo-28238 ‘deki katkısıyla.)

xml.etree.ElementTree modülü, C14N 2.0’ı uygulayan yeni bir -xml.etree.ElementTree.canonicalize() fonksiyonu sağlar. (Stefan Behnel’ın bpo-13611 ‘deki katkısıyla.)

xml.etree.ElementTree.XMLParser hedef nesnesi, yeni start_ns() ve end_ns() geri çağırma yöntemleri aracılığıyla ad alanı bildirimi olaylarını alabilir. Ek olarak, xml.etree.ElementTree.TreeBuilder hedefi, yorumlarla ilgili olayları ve bunları oluşturulan ağaca dahil etmek için işleme talimatlarını işlemek üzere yapılandırılabilir. (Stefan Behnel’ın bpo-36676 ve bpo-36673 ‘teki katkılarıyla.)

xmlrpc

xmlrpc.client.ServerProxy artık her istekle birlikte gönderilecek bir dizi HTTP başlığı için isteğe bağlı bir headers anahtar kelime argümanını destekliyor. Diğer şeylerin yanı sıra, bu, varsayılan temel kimlik doğrulamasından daha hızlı oturum kimlik doğrulamasına yükseltmeyi mümkün kılar. (Cédric Krier’ın bpo-35153 ‘teki katkısıyla.)

Optimizasyonlar

  • subprocess modülü artık daha iyi performans için bazı durumlarda os.posix_spawn() fonksiyonunu kullanabilir. Şu anda, yalnızca macOS ve Linux’ta (glibc 2.24 veya daha yenisini kullanan) tüm bu koşullar yerine getirilirse kullanılmaktadır:

    • close_fds yanlıştır;

    • preexec_fn, pass_fds, cwd ve start_new_session parametreleri ayarlanmamış;

    • yürütülebilir yol bir dizin içerir.

    (Victor Stinner ve Joannah Nanjekye’nin bpo-35537 ‘deki katkılarıyla.)

  • shutil.copyfile(), shutil.copy(), shutil.copy2(), shutil.copytree() ve shutil.move(), dosyayı daha verimli bir şekilde kopyalamak için Linux ve macOS’ta platforma özgü “fast-copy” sistem çağrılarını kullanır. “fast-copy”, kopyalama işleminin çekirdek içinde gerçekleştiği ve Python’da “outfd.write(infd.read())” gibi kullanıcı alanı tamponlarının kullanılmasından kaçınıldığı anlamına gelir. Windows üzerinde shutil.copyfile() daha büyük bir varsayılan tampon boyutu kullanır (16 KiB yerine 1 MiB) ve shutil.copyfileobj() ‘nin memoryview() tabanlı bir çeşidi kullanılır. Aynı bölüm içinde 512 MiB’lık bir dosyayı kopyalamak için hızlanma yaklaşık olarak Linux’te +26%, macOS’da +50% ve Windows’ta +40%’tır. Ayrıca, çok daha az CPU döngüsü tüketilir. Bkz Platform-dependent efficient copy operations bölümü. (Giampaolo Rodolà’nın bpo-33671 ‘deki katkısıyla.)

  • shutil.copytree() os.scandir() fonksiyonunu kullanır ve buna bağlı tüm kopyalama fonksiyonları önbelleğe alınmış os.stat() değerlerini kullanır. Linux’ta 8000 dosyalık bir dizini kopyalama hız değişimi +9% o, Windows’ta +20% ve Windows SMB paylaşımında +30% civarındadır. Ayrıca os.stat() sistem çağrılarının sayısı %38 oranında azaltılarak shutil.copytree() özellikle ağ dosya sistemlerinde daha hızlı hale getirilmiştir. (Giampaolo Rodolà’nın bpo-33695 ‘teki katkısıyla.)

  • pickle modülündeki varsayılan protokol artık ilk olarak Python 3.4’te tanıtılan Protokol 4’tür. Python 3.0’dan beri mevcut olan Protokol 3’e kıyasla daha iyi performans ve daha küçük boyut sunar.

  • Bir Py_ssize_t üyesi PyGC_Head ‘den kaldırıldı. Tüm GC izlenen nesnelerin (örn. tuple, list, dict) boyutu 4 veya 8 bayt azaltıldı. (Inada Naoki’nin bpo-33597 ‘deki katkısıyla.)

  • uuid.UUID artık bellek ayak izini azaltmak için __slots__ kullanıyor. (Wouter Bolsterlee ve Tal Einat’ın bpo-30977 ‘deki katkılarıyla.)

  • operator.itemgetter() fonksiyonunun performansı %33 oranında artırıldı. Argüman işleme optimize edildi ve bir tuple içine negatif olmayan tek bir tamsayı indeksinin yaygın durumu için hızlı bir yol eklendi (standart kütüphanedeki tipik kullanım durumu budur). (Raymond Hettinger’ın bpo-35664 ‘teki katkısıyla.)

  • collections.namedtuple() içindeki alan aramaları hızlandırıldı. Artık iki kattan daha hızlılar, bu da onları Python’daki en hızlı örnek değişken arama biçimi haline getiriyor. (Raymond Hettinger, Pablo Galindo ve Joe Jevnik, Serhiy Storchaka’nın bpo-32492 ‘deki katkılarıyla.)

  • list kurucusu, girdi yinelenebilirinin bilinen bir uzunluğu varsa (girdi __len__ uygular) dahili öğe arabelleğini genel olarak ayırmaz. Bu, oluşturulan listenin ortalama %12 daha küçük olmasını sağlar. (Raymond Hettinger ve Pablo Galindo’nun bpo-33234 ‘teki katkılarıyla.)

  • Sınıf değişkeni yazma hızı iki katına çıkarıldı. Dunder olmayan bir nitelik güncellendiğinde, yuvaları güncellemek için gereksiz bir çağrı vardı. (Stefan Behnel, Pablo Galindo Salgado, Raymond Hettinger, Neil Schemenauer ve Serhiy Storchaka’nın bpo-36012 ‘deki katkılarıyla.)

  • Birçok yerleşik fonksiyon ve metoda aktarılan argümanları dönüştürme yükü azaltıldı. Bu, bazı basit yerleşik fonksiyonların ve yöntemlerin çağrılmasını %20–50’ye kadar hızlandırdı. (Serhiy Storchaka’nın bpo-23867, bpo-35582 ve bpo-36127 ‘deki katkılarıyla.)

  • LOAD_GLOBAL komutu artık yeni “işlem kodu başına önbellek” mekanizmasını kullanıyor. Şimdi yaklaşık 40% daha hızlı. (Yury Selivanov ve Inada Naoki’nin bpo-26219 ‘daki katkılarıyla.)

Derleme ve C API Değişiklikleri

  • Varsayılan sys.abiflags boş bir dize haline geldi: pymalloc için m bayrağı işe yaramaz hale geldi (hem pymalloc içeren hem de içermeyen derlemeler ABI uyumludur) ve bu nedenle kaldırıldı. (Victor Stinner’ın bpo-36707 ‘deki katkısıyla.)

    Değişikliklerin örneği:

    • Sadece python3.8 programı kurulur, python3.8m programı kaldırılır.

    • Yalnızca python3.8-config dizesi yüklendi, python3.8m-config dizesi gitti.

    • Dinamik kütüphane dosya adlarının son ekinden m bayrağı kaldırıldı: standart kütüphanedeki uzantı modüllerinin yanı sıra PyPI’dan indirilenler gibi üçüncü taraf paketleri tarafından üretilen ve yüklenenler. Örneğin Linux’ta Python 3.7 soneki .cpython-37m-x86_64-linux-gnu.so Python 3.8’de .cpython-38-x86_64-linux-gnu.so oldu.

  • Başlık dosyaları, farklı API türlerini daha iyi ayırmak için yeniden düzenlenmiştir:

    • Include/*.h, taşınabilir genel kararlı C API’si olmalıdır.

    • Include/cpython/*.h, CPython’a özgü kararsız C API’si olmalıdır; _Py veya _PY ile ön eklenmiş bazı özel API ile genel API.

    • Include/internal/*.h CPython’a özgü özel dahili C API’sidir. Bu API geriye dönük uyumluluk garantisi olmadan gelir ve CPython dışında kullanılmamalıdır. Sadece hata ayıklayıcılar ve fonksiyonları çağırmadan CPython içlerine erişmek zorunda olan profiller gibi çok özel ihtiyaçlar için açığa çıkar. Bu API artık make install tarafından yüklenmektedir.

    (Eric Snow tarafından Python 3.7’de başlatılan çalışmaya bpo-35134 ve bpo-35081 ‘de Victor Stinner tarafından katkı sağlanmıştır.)

  • Bazı makrolar statik satır içi fonksiyonlara dönüştürülmüştür: parametre türleri ve dönüş türü iyi tanımlanmıştır, makrolara özgü sorunları yoktur, değişkenlerin yerel kapsamları vardır. Örnekler:

    (Victor Stinner’ın bpo-35059 ‘daki katkısıyla.)

  • The PyByteArray_Init() and PyByteArray_Fini() functions have been removed. They did nothing since Python 2.7.4 and Python 3.2.0, were excluded from the limited API (stable ABI), and were not documented. (Contributed by Victor Stinner in bpo-35713.)

  • PyExceptionClass_Name() sonucu artık char * yerine const char * türündedir. (Serhiy Storchaka’nın bpo-33818 ‘deki katkısıyla.)

  • Modules/Setup.dist ve Modules/Setup ikiliği kaldırıldı. Önceden, CPython kaynak ağacını güncellerken, yukarı akıştaki değişiklikleri yansıtmak için Modules/Setup.dist dosyasını (kaynak ağacının içinde) Modules/Setup dosyasına (derleme ağacının içinde) manuel olarak kopyalamak gerekiyordu. Bu, CPython geliştirmesini takip eden geliştiriciler için sık sık can sıkıntısı pahasına paketleyicilere küçük bir fayda sağlıyordu, çünkü dosyayı kopyalamayı unutmak derleme hatalarına neden olabiliyordu.

    Artık derleme sistemi her zaman kaynak ağacının içindeki Modules/Setup dosyasını okuyor. Bu dosyayı özelleştirmek isteyen kişilerin, değişikliklerini CPython’un bir git çatalında veya kaynak ağacındaki diğer değişiklikler için yapacakları gibi yama dosyaları olarak sürdürmeleri teşvik edilir.

    (Antoine Pitrou’nun bpo-32388 ‘deki katkısıyla.)

  • PyLong_AsLong() gibi Python sayısını C tamsayısına dönüştüren fonksiyonlar ve PyArg_ParseTuple() gibi 'i' gibi tamsayı dönüştürme format birimlerine sahip argüman ayrıştırma fonksiyonları artık mümkünse __int__() yerine __index__() özel metodunu kullanacaktır. Kullanımdan kaldırma uyarısı, __int__() yöntemi olan ancak index__() yöntemi olmayan nesneler (Decimal ve Fraction gibi) için verilecektir. PyNumber_Check() artık __index__() yöntemini uygulayan nesneler için 1 değerini döndürecektir. PyNumber_Long(), PyNumber_Float() ve PyFloat_AsDouble() artık mümkünse __index__() yöntemini de kullanmaktadır. (Serhiy Storchaka’nın bpo-36048 ve bpo-20092 ‘deki katkılarıyla.)

  • Yığın tahsisli tip nesneleri artık referans sayılarını PyType_GenericAlloc() yerine PyObject_Init() (ve paralel makrosu PyObject_INIT) içinde artıracaktır. Örnek paylaştırma veya serbest bırakma işlemini değiştiren türlerin ayarlanması gerekebilir. (Eddie Elizondo’nun bpo-35810 ‘daki katkısıyla.)

  • The new function PyCode_NewWithPosOnlyArgs() allows to create code objects like PyCode_New(), but with an extra posonlyargcount parameter for indicating the number of positional-only arguments. (Contributed by Pablo Galindo in bpo-37221.)

  • Py_SetPath() now sets sys.executable to the program full path (Py_GetProgramFullPath()) rather than to the program name (Py_GetProgramName()). (Contributed by Victor Stinner in bpo-38234.)

Kullanımdan kaldırıldı

API ve Özellik Kaldırmaları

Aşağıdaki özellikler ve API’ler Python 3.8’den kaldırılmıştır:

  • Python 3.3 ile başlayarak, ABC’leri collections ‘dan içe aktarmak kullanımdan kaldırıldı ve içe aktarma collections.abc ‘den yapılmalıdır. Koleksiyonlardan içe aktarabilmek 3.8’de kaldırılmak üzere işaretlenmişti, ancak 3.9’a ertelendi. (Bkz. bpo-36952.)

  • Python 3.7’de kullanımdan kaldırılan macpath modülü kaldırıldı. (Victor Stinner’ın bpo-35471 ‘deki katkısıyla.)

  • Python 3.3’ten beri kullanımda olmayan platform.popen() fonksiyonu kaldırıldı: bunun yerine os.popen() kullanın. (Victor Stinner’ın bpo-35345 ‘teki katkısıyla.)

  • Python 3.3’ten beri kullanımdan kaldırılan time.clock() fonksiyonu kaldırıldı: iyi tanımlanmış davranışa sahip olmak için gereksinimlerinize bağlı olarak bunun yerine time.perf_counter() veya time.process_time() kullanın. (Matthias Bussonnier’ın bpo-36895 ‘teki katkısıyla.)

  • pyvenv betiğinin hangi Python yorumlayıcısına bağlı olduğu konusundaki karışıklığı ortadan kaldırmak için python3.8 -m venv betiği lehine pyvenv betiği kaldırıldı. (Brett Cannon’ın bpo-25427 ‘deki katkısıyla.)

  • parse_qs, parse_qsl ve escape cgi modülünden kaldırılmıştır. Python 3.2 veya daha eski sürümlerde kullanımdan kaldırılmışlardır. Bunun yerine urllib.parse ve html modüllerinden içe aktarılmalıdırlar.

  • filemode fonksiyonu tarfile modülünden kaldırılmıştır. Python 3.3’ten beri belgelenmemiştir ve kullanımdan kaldırılmıştır.

  • XMLParser yapıcısı artık html argümanını kabul etmiyor. Hiçbir zaman bir etkisi olmadı ve Python 3.4’te kullanımdan kaldırıldı. Diğer tüm parametreler artık keyword-only şeklindedir. (Serhiy Storchaka’nın bpo-29209 ‘daki katkısıyla.)

  • XMLParser metodunun doctype() metodu kaldırıldı. (Serhiy Storchaka’nın bpo-29209 ‘daki katkısıyla.)

  • “unicode_internal” codec’i kaldırıldı. (Inada Naoki’nin bpo-36297 ‘deki katkısıyla.)

  • sqlite3 modülünün Cache ve Statement nesneleri kullanıcıya açık değildir. (Aviv Palivoda’nın bpo-30262 ‘deki katkısıyla.)

  • Python 3.6’dan beri göz ardı edilen ve kullanımdan kaldırılan fileinput.input() ve fileinput.FileInput() anahtar kelime argümanı bufsize kaldırıldı. bpo-36952 (Matthias Bussonnier’ın katkısıyla.)

  • Python 3.7’de kullanımdan kaldırılan sys.set_coroutine_wrapper() ve sys.get_coroutine_wrapper() fonksiyonları kaldırıldı; bpo-36933 (Matthias Bussonnier’ın katkısıyla.)

Python 3.8’e 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 davranışındaki değişiklikler

  • Yield ifadelerine (hem yield hem de yield from cümleleri) artık anlamalarda ve oluşturucu ifadelerinde (en soldaki for cümlesindeki yinelenebilir ifadesi dışında) izin verilmemektedir. (Serhiy Storchaka’nın bpo-10544 ‘teki katkısıyla.)

  • Derleyici artık kimlik kontrolleri (is ve is not) belirli türdeki değişmezlerle (örneğin dizeler, sayılar) kullanıldığında bir SyntaxWarning üretiyor. Bunlar CPython’da genellikle kazara çalışabilir, ancak dil özellikleri tarafından garanti edilmez. Uyarı, kullanıcılara bunun yerine eşitlik testlerini (== ve !=) kullanmalarını önerir. (Serhiy Storchaka’nın bpo-34850 ‘deki katkısıyla.)

  • CPython yorumlayıcısı bazı durumlarda istisnaları yutabilir. Python 3.8’de bu daha az durumda gerçekleşir. Özellikle, tip sözlüğünden öznitelik alınırken ortaya çıkan istisnalar artık göz ardı edilmiyor. (Serhiy Storchaka’nın bpo-35459 ‘daki katkısıyla.)

  • bool, int, float, complex yerleşik türlerinden ve standart kütüphanedeki birkaç sınıftan __str__ uygulamaları kaldırıldı. Bunlar artık object türünden __str__() miras almaktadır. Sonuç olarak, bu sınıfların alt sınıflarında __repr__() metodunu tanımlamak onların string gösterimlerini etkileyecektir. (Serhiy Storchaka’nın bpo-36793 ‘teki katkısıyla.)

  • On AIX, sys.platform doesn’t contain the major version anymore. It is always 'aix', instead of 'aix3' .. 'aix7'. Since older Python versions include the version number, so it is recommended to always use sys.platform.startswith('aix'). (Contributed by M. Felt in bpo-36588.)

  • PyEval_AcquireLock() and PyEval_AcquireThread() now terminate the current thread if called while the interpreter is finalizing, making them consistent with PyEval_RestoreThread(), Py_END_ALLOW_THREADS(), and PyGILState_Ensure(). If this behavior is not desired, guard the call by checking _Py_IsFinalizing() or sys.is_finalizing(). (Contributed by Joannah Nanjekye in bpo-36475.)

Python API’sindeki değişiklikler

  • os.getcwdb() fonksiyonu artık Windows’ta ANSI kod sayfası yerine UTF-8 kodlamasını kullanıyor: gerekçe için bkz. PEP 529. İşlev artık Windows’ta kullanımdan kaldırılmamıştır. (Victor Stinner’ın bpo-37412 ‘deki katkısıyla.)

  • subprocess.Popen artık daha iyi performans için bazı durumlarda os.posix_spawn() kullanabilir. Linux ve QEMU Kullanıcı Emülasyonu için Windows Alt Sisteminde, os.posix_spawn() kullanan Popen kurucusu artık “eksik program” gibi hatalarda bir istisna oluşturmuyor. Bunun yerine alt süreç sıfır olmayan bir returncode ile başarısız olur. (Joannah Nanjekye ve Victor Stinner’ın bpo-35537 ‘deki katkılarıyla.)

  • subprocess.Popen parametresinin preexec_fn argümanı artık alt yorumlayıcılarla uyumlu değildir. Parametrenin bir alt yorumlayıcıda kullanılması artık RuntimeError uyarısı veriyor. (Eric Snow tarafından bpo-34651 ‘de katkıda bulunulmuş, Christian Heimes tarafından bpo-37951 ‘de değiştirilmiştir.)

  • imap.IMAP4.logout() yöntemi artık keyfi istisnaları sessizce yok saymaz. (Victor Stinner’ın bpo-36348 ‘deki katkısıyla.)

  • Python 3.3’ten beri kullanımda olmayan platform.popen() fonksiyonu kaldırıldı: bunun yerine os.popen() kullanın. (Victor Stinner’ın bpo-35345 ‘teki katkısıyla.)

  • statistics.mode() fonksiyonu artık çok modlu veriler verildiğinde bir istisna oluşturmuyor. Bunun yerine, girdi verilerinde karşılaşılan ilk modu döndürür. (Raymond Hettinger’ın bpo-35892 ‘deki katkısıyla.)

  • tkinter.ttk.Treeview sınıfının selection() yöntemi artık argüman almıyor. Seçimi değiştirmek için argümanlarla kullanılması Python 3.6’da kullanımdan kaldırılmıştır. Seçimi değiştirmek için selection_set() gibi özel yöntemler kullanın. (Serhiy Storchaka’ın bpo-31508 ‘deki katkısıyla.)

  • xml.dom.minidom metodunun writexml(), toxml() ve toprettyxml() metotları ve xml.etree metodunun write() metodu artık kullanıcı tarafından belirtilen öznitelik sırasını korumaktadır. (Diego Rojas ve Raymond Hettinger’ın bpo-34160 ‘daki katkılarıyla.)

  • Bir dbm.dumb veritabanı 'r' bayraklarıyla açıldığında artık salt okunurdur. dbm.dumb.open(), 'r' ve 'w' bayraklarıyla artık mevcut değilse bir veritabanı oluşturmaz. (Serhiy Storchaka’nın bpo-32749 ‘daki katkısıyla.)

  • XMLParser alt sınıfında tanımlanan doctype() yöntemi artık çağrılmayacak ve bir DeprecationWarning yerine bir RuntimeWarning yayacaktır. Bir XML doctype bildirimini işlemek için bir hedef üzerinde doctype() yöntemini tanımlayın. (Serhiy Storchaka’nın bpo-29209 ‘daki katkısıyla.)

  • Özel metaclass, type.__new__ ‘e aktarılan ad alanında __classcell__ girdisini sağlamadığında artık bir RuntimeError ortaya çıkıyor. Bir DeprecationWarning Python 3.6–3.7` ‘de yayınlandı (Serhiy Storchaka’nın bpo-23722 ‘deki katkısıyla.)

  • cProfile.Profile sınıfı artık bir bağlam yöneticisi olarak kullanılabilir. (Scott Sanderson’ın bpo-29235 ‘teki katkısıyla.)

  • shutil.copyfile(), shutil.copy(), shutil.copy2(), shutil.copytree() ve shutil.move() platforma özgü “fast-copy” sistem çağrılarını kullanır (bkz. Platform-dependent efficient copy operations bölümü).

  • shutil.copyfile() Windows üzerindeki varsayılan tampon boyutu 16 KiB’den 1 MiB’ye değiştirildi.

  • PyGC_Head yapısı tamamen değişti. Bu yapı üyesine dokunan tüm kodlar yeniden yazılmalıdır. (Bkz bpo-33597.)

  • PyInterpreterState yapısı “dahili” başlık dosyalarına taşınmıştır (özellikle Include/internal/pycore_pystate.h). Opak bir PyInterpreterState hala genel API’nin (ve kararlı ABI’nin) bir parçası olarak mevcuttur. Dokümanlar, yapının hiçbir alanının herkese açık olmadığını belirtmektedir, bu nedenle kimsenin bunları kullanmadığını umuyoruz. Ancak, bu özel alanlardan birine veya daha fazlasına güveniyorsanız ve alternatifiniz yoksa, lütfen bir BPO sorunu açın. Ayarlama yapmanıza yardımcı olmak için çalışacağız (muhtemelen genel API’ye erişim fonksiyonları eklemek dahil). (Bkz. bpo-35886.)

  • mmap.flush() yöntemi artık başarı durumunda None değerini döndürmekte ve tüm platformlarda hata durumunda bir istisna oluşturmaktadır. Önceden metodun davranışı platforma bağlıydı: başarı durumunda sıfır olmayan bir değer döndürülüyordu; Windows altında hata durumunda sıfır döndürülüyordu. Unix altında başarı durumunda sıfır değeri döndürülürken hata durumunda bir istisna ortaya çıkıyordu. (Berker Peksağ’ın bpo-2122 ‘deki katkısıyla.)

  • xml.dom.minidom ve xml.sax modülleri artık varsayılan olarak harici varlıkları işlemiyor. (Christian Heimes’in bpo-17239 ‘daki katkısıyla.)

  • Salt okunur dbm veritabanından bir anahtar silindiğinde (dbm.dumb, dbm.gnu veya dbm.ndbm) KeyError yerine error (dbm.dumb.error, dbm.gnu.error veya dbm.ndbm.error) ortaya çıkar. (Xiang Zhang’ın bpo-33106 ‘teki katkılarıyla.)

  • Değişmezler için basitleştirilmiş AST. Tüm sabitler ast.Constant örnekleri olarak temsil edilecektir. Eski Num, Str, Bytes, NameConstant ve Ellipsis sınıflarını örneklemek bir Constant örneği döndürecektir. (Serhiy Storchaka’nın bpo-32892 ‘deki katkısıyla.)

  • Windows üzerinde expanduser() artık USERPROFILE ortam değişkenini tercih ediyor ve normalde normal kullanıcı hesapları için ayarlanmamış olan HOME değişkenini kullanmıyor. (Anthony Sottile’nin bpo-36264 ‘deki katkısıyla.)

  • İstisna asyncio.CancelledError artık Exception yerine BaseException ‘dan miras alıyor ve artık concurrent.futures.CancelledError ‘dan miras almıyor. (Yury Selivanov’un bpo-32528 ‘deki katkısıyla.)

  • asyncio.wait_for() fonksiyonu artık asyncio.Task örneğini kullanırken iptal için doğru şekilde bekliyor. Önceden, zaman aşımına ulaşıldığında iptal ediliyor ve hemen geri dönüyordu. (Elvis Pranskevichus’un bpo-32751 ‘deki katkısıyla.)

  • Fonksiyon asyncio.BaseTransport.get_extra_info() artık name parametresine ‘socket’ geçildiğinde kullanımı güvenli bir soket nesnesi döndürüyor. (Yury Selivanov’un bpo-37027 ‘deki katkısıyla.)

  • asyncio.BufferedProtocol kararlı API’ye geçiş yaptı.

  • Windows üzerinde ctypes ile yüklenen uzantı modülleri ve DLL’ler için DLL bağımlılıkları artık daha güvenli bir şekilde çözümlenmektedir. Yükleme zamanı bağımlılıkları için yalnızca sistem yolları, DLL veya PYD dosyasını içeren dizin ve add_dll_directory() ile eklenen dizinler aranır. Özellikle, PATH ve geçerli çalışma dizini artık kullanılmamaktadır ve bunlarda yapılan değişikliklerin normal DLL çözümlemesi üzerinde herhangi bir etkisi olmayacaktır. Uygulamanız bu mekanizmalara güveniyorsa, add_dll_directory() dosyasını kontrol etmeli ve varsa, kütüphanenizi yüklerken DLL’lerinizin dizinini eklemek için kullanmalısınız. Windows 7 kullanıcılarının Windows Update KB2533623’ün yüklendiğinden emin olmaları gerektiğini unutmayın (bu aynı zamanda yükleyici tarafından da doğrulanır). (Steve Dower’ın bpo-36085 ‘teki katkısıyla.)

  • Pgen ile ilgili başlık dosyaları ve fonksiyonlar, saf bir Python uygulamasıyla değiştirildikten sonra kaldırılmıştır. (Pablo Galindo’nun bpo-36623 ‘teki katkısıyla.)

  • types.CodeType, PEP 570 ‘te tanımlanan sadece pozisyonel argümanları desteklemek için kurucunun ikinci pozisyonunda (posonlyargcount) yeni bir parametreye sahiptir. İlk argüman (argcount) artık toplam konumsal argüman sayısını (sadece konumsal argümanlar dahil) temsil etmektedir. types.CodeType ‘ın yeni replace() yöntemi, kodu geleceğe hazır hale getirmek için kullanılabilir.

  • hmac.new() için digestmod parametresi artık varsayılan olarak MD5 özetini kullanmıyor.

C API’sindeki değişiklikler

  • PyCompilerFlags yapısı yeni bir cf_feature_version alanına sahiptir. Bu alan PY_MINOR_VERSION olarak başlatılmalıdır. Bu alan varsayılan olarak yok sayılır ve yalnızca cf_flags içinde PyCF_ONLY_AST bayrağı ayarlanmışsa kullanılır. (Guido van Rossum’un bpo-35766 ‘teki katkısıyla.)

  • The PyEval_ReInitThreads() function has been removed from the C API. It should not be called explicitly: use PyOS_AfterFork_Child() instead. (Contributed by Victor Stinner in bpo-36728.)

  • Unix’te, Android ve Cygwin dışında C uzantıları artık libpython’a bağlı değildir. Python gömülü olduğunda, libpython RTLD_LOCAL ile değil, bunun yerine RTLD_GLOBAL ile yüklenmelidir. Önceden RTLD_LOCAL kullanıldığında, Modules/Setup bölümünün *shared* bölümü tarafından oluşturulan standart kütüphanenin C uzantıları gibi libpython ile bağlantılı olmayan C uzantılarını yüklemek zaten mümkün değildi. (Victor Stinner’ın bpo-21536 ‘daki katkısıyla.)

  • Ayrıştırma veya değer oluşturmada biçimlerin # varyantlarının kullanımı (örneğin PyArg_ParseTuple(), Py_BuildValue(), PyObject_CallFunction(), vb.) PY_SSIZE_T_CLEAN tanımlanmadan artık DeprecationWarning verir. Bu uyarı 3.10 veya 4.0’da kaldırılacaktır. Ayrıntılar için Parsing arguments and building values sayfasını okuyun. (Inada Naoki’nin bpo-36381 ‘teki katkısıyla.)

  • Yığın tahsisli tiplerin örnekleri (örneğin PyType_FromSpec() ile oluşturulanlar) tip nesnelerine bir referans tutar. Bu tip nesnelerinin referans sayısının artırılması PyType_GenericAlloc() fonksiyonundan daha düşük seviyeli PyObject_Init() ve PyObject_INIT() fonksiyonlarına taşınmıştır. Bu, PyType_FromSpec() aracılığıyla oluşturulan türlerin yönetilen koddaki diğer sınıflar gibi davranmasını sağlar.

    Statically allocated types etkilenmez.

    Durumların büyük çoğunluğu için herhangi bir yan etki olmamalıdır. Ancak, bir örnek tahsis ettikten sonra referans sayısını manuel olarak artıran türler (belki de hatanın etrafında çalışmak için) artık ölümsüz hale gelebilir. Bundan kaçınmak için, bu sınıfların örnek ayırma sırasında tür nesnesi üzerinde Py_DECREF’i çağırması gerekir.

    Bu türleri 3.8 ‘e doğru bir şekilde taşımak için lütfen aşağıdaki değişiklikleri uygulayın:

    • Remove Py_INCREF on the type object after allocating an instance - if any. This may happen after calling PyObject_New, PyObject_NewVar, PyObject_GC_New(), PyObject_GC_NewVar(), or any other custom allocator that uses PyObject_Init() or PyObject_INIT().

      Örnek:

      static foo_struct *
      foo_new(PyObject *type) {
          foo_struct *foo = PyObject_GC_New(foo_struct, (PyTypeObject *) type);
          if (foo == NULL)
              return NULL;
      #if PY_VERSION_HEX < 0x03080000
          // Workaround for Python issue 35810; no longer necessary in Python 3.8
          PY_INCREF(type)
      #endif
          return foo;
      }
      
    • Yığın tahsisli türlerin tüm özel tp_dealloc fonksiyonlarının, türün referans sayısını azalttığından emin olun.

      Örnek:

      static void
      foo_dealloc(foo_struct *instance) {
          PyObject *type = Py_TYPE(instance);
          PyObject_GC_Del(instance);
      #if PY_VERSION_HEX >= 0x03080000
          // This was not needed before Python 3.8 (Python issue 35810)
          Py_DECREF(type);
      #endif
      }
      

    (Eddie Elizondo’nun bpo-35810 ‘daki katkısıyla.)

  • Py_DEPRECATED() makrosu MSVC için uygulanmıştır. Makro artık sembol adından önce yerleştirilmelidir.

    Örnek:

    Py_DEPRECATED(3.8) PyAPI_FUNC(int) Py_OldFunction(void);
    

    (Zackery Spytz’in bpo-33407 ‘deki katkısıyla.)

  • The interpreter does not pretend to support binary compatibility of extension types across feature releases, anymore. A PyTypeObject exported by a third-party extension module is supposed to have all the slots expected in the current Python version, including tp_finalize (Py_TPFLAGS_HAVE_FINALIZE is not checked anymore before reading tp_finalize).

    (Antoine Pitrou’nun bpo-32388 ‘deki katkısıyla.)

  • The functions PyNode_AddChild() and PyParser_AddToken() now accept two additional int arguments end_lineno and end_col_offset.

  • MinGW araçlarının doğrudan python38.dll dosyasına bağlanmasını sağlayan libpython38.a dosyası artık normal Windows dağıtımına dahil değildir. Bu dosyaya ihtiyacınız varsa, MinGW binutils paketinin bir parçası olan gendef ve dlltool araçları ile oluşturulabilir:

    gendef - python38.dll > tmp.def
    dlltool --dllname python38.dll --def tmp.def --output-lib libpython38.a
    

    Yüklü bir pythonXY.dll dosyasının konumu, kurulum seçeneklerine ve Windows’un sürümüne ve diline bağlı olacaktır. Daha fazla bilgi için Windows’ta kullanma konusuna bakın. Ortaya çıkan kitaplık, genellikle Python kurulumunuzun altındaki libs dizini olan pythonXY.lib ile aynı dizine yerleştirilmelidir.

    (Steve Dower’ın bpo-37351 ‘deki katkısıyla.)

CPython bayt kodu değişiklikleri

  • Yorumlayıcı döngüsü, blok yığınını açma mantığı derleyiciye taşınarak basitleştirilmiştir. Derleyici artık değer yığınını ayarlamak ve break, continue ve return için temizleme kodunu çağırmak için açık talimatlar yayınlar.

    BREAK_LOOP, CONTINUE_LOOP, SETUP_LOOP ve SETUP_EXCEPT kodları kaldırıldı. Yeni ROT_FOUR, BEGIN_FINALLY, CALL_FINALLY ve POP_FINALLY kodları eklendi. END_FINALLY ve WITH_CLEANUP_START davranışları değiştirildi.

    (Mark Shannon, Antoine Pitrou ve Serhiy Storchaka’nın bpo-17611 ‘deki katkılarıyla.)

  • Bir async for döngüsünde bir sonraki öğe beklenirken ortaya çıkan istisnaları işlemek için yeni END_ASYNC_FOR kodu eklendi. (Serhiy Storchaka’nın bpo-33041 ‘deki katkısıyla.)

  • MAP_ADD artık değeri yığının ilk elemanı ve anahtarı da ikinci eleman olarak beklemektedir. Bu değişiklik, PEP 572 tarafından önerildiği gibi, sözlük kavramalarında anahtarın her zaman değerden önce değerlendirilmesi için yapılmıştır. (Jörn Heissler’ın bpo-35224 ‘teki katkısıyla.)

Demolar ve Araçlar

Değişkenlere erişmenin çeşitli yollarını zamanlamak için bir kıyaslama dizesi eklendi: Tools/scripts/var_access_benchmark.py. (Raymond Hettinger’ın bpo-35884 ‘teki katkısıyla.)

İşte Python 3.3’ten bu yana performans iyileştirmelerinin bir özeti:

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

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

Variable and attribute write access:
    write_local                      4.6     8.7     9.3     5.5     5.3     4.3
    write_nonlocal                   7.3    10.5    11.1     5.6     5.5     4.7
    write_global                    15.9    19.7    21.2    18.0    18.0    15.8
    write_classvar                  81.9    92.9    96.0   104.6   102.1    39.2
    write_instancevar               36.4    44.6    45.8    40.0    38.9    35.5
    write_instancevar_slots         28.7    35.6    36.1    27.3    26.6    25.7

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

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

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

Timing loop:
    loop_overhead                    0.3     0.5     0.6     0.4     0.3     0.3

The benchmarks were measured on an Intel® Core™ i7-4960HQ processor running the macOS 64-bit builds found at python.org. The benchmark script displays timings in nanoseconds.

Python 3.8.1’deki önemli değişiklikler

Önemli güvenlik endişeleri nedeniyle, asyncio.loop.create_datagram_endpoint() parametresinin 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 bpo-37228 ‘deki katkılarıyla.)

Notable changes in Python 3.8.2

Fixed a regression with the ignore callback of shutil.copytree(). The argument types are now str and List[str] again. (Contributed by Manuel Barkhau and Giampaolo Rodola in gh-83571.)

Notable changes in Python 3.8.3

The constant values of future flags in the __future__ module are updated in order to prevent collision with compiler flags. Previously PyCF_ALLOW_TOP_LEVEL_AWAIT was clashing with CO_FUTURE_DIVISION. (Contributed by Batuhan Taskaya in gh-83743)

Python 3.8.8’deki önemli değişiklikler

Daha ö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 önerilerine 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 aynı zamanda cgi.parse() ve cgi.parse_multipart() fonksiyonlarını da etkilemektedir. Daha fazla ayrıntı için lütfen ilgili belgelere bakın. (Adam Goldschmidt, Senthil Kumaran ve Ken Jin’in bpo-42967 ‘deki katkılarıyla.)

Notable changes in Python 3.8.9

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.8.10

macOS 11.0 (Big Sur) and Apple Silicon Mac support

As of 3.8.10, Python now supports building and running on macOS 11 (Big Sur) and on Apple Silicon Macs (based on the ARM64 architecture). A new universal build variant, universal2, is now available to natively support both ARM64 and Intel 64 in one set of executables. Note that support for “weaklinking”, building binaries targeted for newer versions of macOS that will also run correctly on older versions by testing at runtime for missing features, is not included in this backport from Python 3.9; to support a range of macOS versions, continue to target for and build on the oldest version in the range.

(Originally contributed by Ronald Oussoren and Lawrence D’Anna in gh-85272, with fixes by FX Coudert and Eli Rykoff, and backported to 3.8 by Maxime Bélanger and Ned Deily)

Notable changes in Python 3.8.10

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 bpo-43882)

Python 3.8.12’deki önemli değişiklikler

Python API’sindeki değişiklikler

Python 3.8.12’den 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 fonksiyon 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.

(Aslen bpo-36384 içinde Christian Heimes tarafından katkıda bulunulmuştur ve Achraf Merzouki tarafından 3.8’e geri aktarılmıştır.)

Notable security feature in 3.8.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.8.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.)