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-string*s 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:

* "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()" 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
-----------

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

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