# 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

The ABI of Python debug builds is now compatible with Python release builds. On Unix, when Python is built in debug mode, it is now possible to load C extensions built in release mode and C extensions built using the stable ABI. The inverse is not true, as debug builds expose additional symbols not available in release builds.

Defining the `Py_DEBUG` macro no longer implies the `Py_TRACE_REFS` macro, which introduces the only ABI incompatibility. The `Py_TRACE_REFS` macro, which adds the `sys.getobjects()` function and the `PYTHONDUMPREFS` environment variable, can be set using the new `./configure --with-trace-refs` build option. (Contributed by Victor Stinner in bpo-36465.)

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:

    >>> import datetime as dt
    >>> user = 'eric_idle'
    >>> member_since = dt.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 = dt.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:

- `PyConfig`

- `PyPreConfig`

- `PyStatus`

- `PyWideStringList`

Yeni fonksiyonlar:

- `PyConfig_Clear()`

- `PyConfig_InitIsolatedConfig()`

- `PyConfig_InitPythonConfig()`

- `PyConfig_Read()`

- `PyConfig_SetArgv()`

- `PyConfig_SetBytesArgv()`

- `PyConfig_SetBytesString()`

- `PyConfig_SetString()`

- `PyPreConfig_InitIsolatedConfig()`

- `PyPreConfig_InitPythonConfig()`

- `PyStatus_Error()`

- `PyStatus_Exception()`

- `PyStatus_Exit()`

- `PyStatus_IsError()`

- `PyStatus_IsExit()`

- `PyStatus_NoMemory()`

- `PyStatus_Ok()`

- `PyWideStringList_Append()`

- `PyWideStringList_Insert()`

- `Py_BytesMain()`

- `Py_ExitStatusException()`

- `Py_InitializeFromConfig()`

- `Py_PreInitialize()`

- `Py_PreInitializeFromArgs()`

- `Py_PreInitializeFromBytesArgs()`

- `Py_RunMain()`

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

- The `object.__reduce__()` method can now return a tuple from two to six elements long. Formerly, five was the limit. The new, optional sixth element is a callable with a `(obj, state)` signature. This allows the direct control over the state-updating behavior of a specific object. If not None, this callable will have priority over the object’s `__setstate__()` method. (Contributed by Pierre Glaser and Olivier Grisel in bpo-35900.)

## 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` can now be used as a straight decorator rather than as a function returning a decorator. So both of these are now supported:

    @lru_cache
    def f(x):
        ...

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

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

Added a new `@functools.cached_property` decorator, for computed properties cached for the life of the instance.

    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

The `inspect.getdoc()` function can now find docstrings for `__slots__` if that attribute is a `dict` where the values are docstrings. This provides documentation options similar to what we already have for `@property`, `@classmethod`, and `@staticmethod`:

    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

Added a force keyword argument to `logging.basicConfig()`. When set to true, any existing handlers attached to the root logger are removed and closed before carrying out the configuration specified by the other arguments.

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

On Windows, much of the manual logic for handling reparse points (including symlinks and directory junctions) has been delegated to the operating system. Specifically, `os.stat()` will now traverse anything supported by the operating system, while `os.lstat()` will only open reparse points that identify as “name surrogates” while others are opened as for `os.stat()`. In all cases, `os.stat_result.st_mode` will only have `S_IFLNK` set for symbolic links and not other kinds of reparse points. To identify other kinds of reparse point, check the new `os.stat_result.st_reparse_tag` attribute.

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

`pathlib.Path` methods that return a boolean result like `exists()`, `is_dir()`, `is_file()`, `is_mount()`, `is_symlink()`, `is_block_device()`, `is_char_device()`, `is_fifo()`, `is_socket()` now return `False` instead of raising `ValueError` or its subclass `UnicodeEncodeError` for paths that contain characters unrepresentable at the OS level. (Contributed by Serhiy Storchaka in bpo-33721.)

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

Added `create_server()` and `has_dualstack_ipv6()` convenience functions to automate the necessary tasks usually involved when creating a server socket, including accepting both IPv4 and IPv6 connections on the same socket. (Contributed by Giampaolo Rodolà in bpo-17561.)

The `socket.if_nameindex()`, `socket.if_nametoindex()`, and `socket.if_indextoname()` functions have been implemented on Windows. (Contributed by Zackery Spytz in bpo-37007.)

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

Added `statistics.fmean()` as a faster, floating-point variant of `statistics.mean()`. (Contributed by Raymond Hettinger and Steven D’Aprano in bpo-35904.)

Added `statistics.geometric_mean()` (Contributed by Raymond Hettinger in bpo-27181.)

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

Added methods `selection_from()`, `selection_present()`, `selection_range()` and `selection_to()` in the `tkinter.Spinbox` class. (Contributed by Juliette Monsel in bpo-34829.)

Added method `moveto()` in the `tkinter.Canvas` class. (Contributed by Juliette Monsel in bpo-23831.)

The `tkinter.PhotoImage` class now has `transparency_get()` and `transparency_set()` methods. (Contributed by Zackery Spytz in bpo-25451.)

### 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” variables, functions, methods and classes. See PEP 591, `typing.Final` and `@typing.final`. The final qualifier instructs a static type checker to restrict subclassing, overriding, or reassignment:

      pi: Final[float] = 3.1415926536

- Protocol definitions. See PEP 544, `typing.Protocol` and `@typing.runtime_checkable`. Simple ABCs like `typing.SupportsInt` are now `Protocol` subclasses.

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

Added `addModuleCleanup()` and `addClassCleanup()` to unittest to support cleanups for `setUpModule()` and `setUpClass()`. (Contributed by Lisa Roach in bpo-24412.)

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

The `xml.etree.ElementTree` module provides a new function `canonicalize()` that implements C14N 2.0. (Contributed by Stefan Behnel in bpo-13611.)

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

  - `Py_INCREF()`, `Py_DECREF()`

  - `Py_XINCREF()`, `Py_XDECREF()`

  - `PyObject_INIT`, `PyObject_INIT_VAR`

  - Private functions: `_PyObject_GC_TRACK()`, `_PyObject_GC_UNTRACK()`, `_Py_Dealloc()`

  (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ı

- Distutils `bdist_wininst` komutu artık kullanımdan kaldırılmıştır, bunun yerine `bdist_wheel` (tekerlek paketleri) kullanın. (Victor Stinner’ın bpo-37481 ‘deki katkısıyla.)

- `ElementTree` modülündeki kullanımdan kaldırılan `getchildren()` ve `getiterator()` yöntemleri artık `PendingDeprecationWarning` yerine bir `DeprecationWarning` yayıyor. Python 3.9’da kaldırılacaklar. (Serhiy Storchaka’nın bpo-29209 ‘daki katkısıyla.)

- Bir `concurrent.futures.ThreadPoolExecutor` örneği olmayan bir nesneyi `loop.set_default_executor()` ‘a geçirmek kullanımdan kaldırılmıştır ve Python 3.9’da yasaklanacaktır. (Elvis Pranskevichus’un bpo-34075 ‘teki katkısıyla.)

- The `__getitem__()` methods of `xml.dom.pulldom.DOMEventStream`, `wsgiref.util.FileWrapper` and `fileinput.FileInput` have been deprecated.

  Bu yöntemlerin uygulamaları index parametresini yok saymakta ve bunun yerine bir sonraki öğeyi döndürmektedir. (Berker Peksag’ın bpo-9372 ‘deki katkısıyla.)

- `typing.NamedTuple` sınıfı, aynı bilgileri içeren `__annotations__` niteliği lehine `_field_types` niteliğini kullanımdan kaldırmıştır. (Raymond Hettinger’ın bpo-36320 ‘deki katkısıyla.)

- `ast` sınıfları `Num`, `Str`, `Bytes`, `NameConstant` ve `Ellipsis` kullanımdan kaldırılmıştır ve gelecek Python sürümlerinde kaldırılacaktır. Yerine `Constant` kullanılmalıdır. (Serhiy Storchaka’nın bpo-32892 ‘deki katkısıyla.)

- `ast.NodeVisitor` metotları `visit_Num()`, `visit_Str()`, `visit_Bytes()`, `visit_NameConstant()` ve `visit_Ellipsis()` artık kullanımdan kaldırılmıştır ve gelecekteki Python sürümlerinde çağrılmayacaktır. Tüm sabit düğümleri işlemek için `visit_Constant()` yöntemini ekleyin. (Serhiy Storchaka’nın bpo-36917 ‘deki katkısıyla.)

- The `@asyncio.coroutine` decorator is deprecated and will be removed in version 3.10. Instead of `@asyncio.coroutine`, use `async def` instead. (Contributed by Andrew Svetlov in bpo-36921.)

- `asyncio` içinde, bir loop argümanının açıkça geçilmesi kullanımdan kaldırılmıştır ve 3.10 sürümünde aşağıdakiler için kaldırılacaktır: `asyncio.sleep()`, `asyncio.gather()`, `asyncio.shield()`, `asyncio.wait_for()`, `asyncio.wait()`, `asyncio.as_completed()`, `asyncio.Task`, `asyncio.Lock`, `asyncio.Event`, `asyncio.Condition`, `asyncio.Semaphore`, `asyncio.BoundedSemaphore`, `asyncio.Queue`, `asyncio.create_subprocess_exec()`, ve `asyncio.create_subprocess_shell()`.

- Korutin nesnelerinin `asyncio.wait()` ‘e açık bir şekilde aktarılması kullanımdan kaldırılmıştır ve 3.11 sürümünde kaldırılacaktır (Yury Selivanov’un bpo-34790 ‘daki katkısıyla.)

- The following functions and methods are deprecated in the `gettext` module: `lgettext()`, `ldgettext()`, `lngettext()` and `ldngettext()`. They return encoded bytes, and it’s possible that you will get unexpected Unicode-related exceptions if there are encoding problems with the translated strings. It’s much better to use alternatives which return Unicode strings in Python 3. These functions have been broken for a long time.

  Function `bind_textdomain_codeset()`, methods `NullTranslations.output_charset()` and `NullTranslations.set_output_charset()`, and the codeset parameter of functions `translation()` and `install()` are also deprecated, since they are only used for the `l*gettext()` functions. (Contributed by Serhiy Storchaka in bpo-33710.)

- The `isAlive()` method of `threading.Thread` has been deprecated. (Contributed by Donghee Na in bpo-35283.)

- Tamsayı argümanları alan birçok yerleşik ve uzantı fonksiyonu artık `Decimal`, `Fraction` ve yalnızca bir kayıpla tamsayılara dönüştürülebilen diğer nesneler (örneğin `__int__()` yöntemine sahip olan ancak `__index__()` yöntemine sahip olmayan) için bir kullanımdan kaldırma uyarısı verecektir. Gelecek sürümde bunlar hata olacaktır. (Serhiy Storchaka’nın bpo-36048 ‘deki katkısıyla.)

- Aşağıdaki bağımsız değişkenlerin anahtar sözcük bağımsız değişkenleri olarak iletilmesi kullanımdan kaldırılmıştır:

  - func in `functools.partialmethod()`, `weakref.finalize()`, `profile.Profile.runcall()`, `cProfile.Profile.runcall()`, `bdb.Bdb.runcall()`, `trace.Trace.runfunc()` and `curses.wrapper()`.

  - `unittest.TestCase.addCleanup()` içindeki fonksiyon.

  - fn içinde `submit()` yöntemi `concurrent.futures.ThreadPoolExecutor` ve `concurrent.futures.ProcessPoolExecutor`.

  - callback in `contextlib.ExitStack.callback()`, `contextlib.AsyncExitStack.callback()` and `contextlib.AsyncExitStack.push_async_callback()`.

  - c and typeid in the `create()` method of `multiprocessing.managers.Server` and `multiprocessing.managers.SharedMemoryServer`.

  - `weakref.finalize()` içindeki obj.

  Python’un gelecekteki sürümlerinde, bunlar positional-only olacaktır. (Serhiy Storchaka’nın bpo-36492 ‘deki katkısıyla.)

## API ve Özellik Kaldırmaları

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

- Starting with Python 3.3, importing ABCs from `collections` was deprecated, and importing should be done from `collections.abc`. Being able to import from collections was marked for removal in 3.8, but has been delayed to 3.9. (See gh-81134.)

- The `macpath` module, deprecated in Python 3.7, has been removed. (Contributed by Victor Stinner in bpo-35471.)

- The function `platform.popen()` has been removed, after having been deprecated since Python 3.3: use `os.popen()` instead. (Contributed by Victor Stinner in bpo-35345.)

- The function `time.clock()` has been removed, after having been deprecated since Python 3.3: use `time.perf_counter()` or `time.process_time()` instead, depending on your requirements, to have well-defined behavior. (Contributed by Matthias Bussonnier in bpo-36895.)

- `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`, and `escape` are removed from the `cgi` module. They are deprecated in Python 3.2 or older. They should be imported from the `urllib.parse` and `html` modules instead.

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

- The functions `sys.set_coroutine_wrapper()` and `sys.get_coroutine_wrapper()` deprecated in Python 3.7 have been removed; bpo-36933 (Contributed by Matthias Bussonnier.)

## 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` can now use `os.posix_spawn()` in some cases for better performance. On Windows Subsystem for Linux and QEMU User Emulation, the `Popen` constructor using `os.posix_spawn()` no longer raises an exception on errors like “missing program”. Instead the child process fails with a non-zero `returncode`. (Contributed by Joannah Nanjekye and Victor Stinner in bpo-35537.)

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

- The `imaplib.IMAP4.logout()` method no longer silently ignores arbitrary exceptions. (Contributed by Victor Stinner in bpo-36348.)

- The function `platform.popen()` has been removed, after having been deprecated since Python 3.3: use `os.popen()` instead. (Contributed by Victor Stinner in bpo-35345.)

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

- The `writexml()`, `toxml()` and `toprettyxml()` methods of `xml.dom.minidom` and the `write()` method of `xml.etree.ElementTree` now preserve the attribute order specified by the user. (Contributed by Diego Rojas and Raymond Hettinger in bpo-34160.)

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

- The `cProfile.Profile` class can now be used as a context manager. (Contributed by Scott Sanderson in bpo-29235.)

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

- Deleting a key from a read-only `dbm` database (`dbm.dumb`, `dbm.gnu` or `dbm.ndbm`) raises `error` (`dbm.dumb.error`, `dbm.gnu.error` or `dbm.ndbm.error`) instead of `KeyError`. (Contributed by Xiang Zhang in bpo-33106.)

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

- Instances of heap-allocated types (such as those created with `PyType_FromSpec()`) hold a reference to their type object. Increasing the reference count of these type objects has been moved from `PyType_GenericAlloc()` to the more low-level functions, `PyObject_Init()` and `PyObject_INIT`. This makes types created through `PyType_FromSpec()` behave like other classes in managed code.

  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.

  Removed opcodes `BREAK_LOOP`, `CONTINUE_LOOP`, `SETUP_LOOP` and `SETUP_EXCEPT`. Added new opcodes `ROT_FOUR`, `BEGIN_FINALLY`, `CALL_FINALLY` and `POP_FINALLY`. Changed the behavior of `END_FINALLY` and `WITH_CLEANUP_START`.

  (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

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

## Notable changes in Python 3.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.)