Python 3.8’deki Yenilikler¶
- Editör:
Raymond Hettinger
Bu makale, 3.7 ile karşılaştırıldığında Python 3.8 ‘deki yeni özellikleri açıklamaktadır. Tüm ayrıntılar için Changelog ‘a bakın.
Özet – Sürümün öne çıkanları¶
Yeni Özellikler¶
Atama ifadeleri¶
Daha büyük bir ifadenin parçası olarak değişkenlere değerler atayan yeni sözdizimi :=
var. Bir morsun gözlerine ve dişlerine benzerliği nedeniyle “mors operatörü” olarak bilinir.
Bu örnekte, atama ifadesi len()
öğesini iki kez çağırmaktan kaçınmaya yardımcı olur:
if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
Benzer bir fayda, eşleştirme nesnelerine iki kez ihtiyaç duyulan normal ifade eşleştirme sırasında ortaya çıkar; bir kez bir eşleşme olup olmadığını test etmek ve başka bir kez bir alt grup çıkarmak için:
discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
discount = float(mo.group(1)) / 100.0
Operatör, döngü sonlandırmasını test etmek için bir değer hesaplayan ve ardından döngü gövdesinde aynı değere tekrar ihtiyaç duyan while döngülerinde de kullanışlıdır:
# Loop over fixed length blocks
while (block := f.read(256)) != '':
process(block)
Başka bir motive edici kullanım durumu, bir filtreleme koşulunda hesaplanan bir değerin ifade gövdesinde de gerekli olduğu liste üreteçlerinde ortaya çıkar:
[clean_name.title() for name in names
if (clean_name := normalize('NFC', name)) in allowed_names]
Karmaşıklığı azaltan ve okunabilirliği artıran vakaları temizlemek için mors operatörünün kullanımını sınırlamaya çalışın.
Tam açıklama için PEP 572 konusuna bakın.
(Emily Morehouse’un bpo-35224 ‘teki katkısıyla.)
Yalnızca konumsal parametreler¶
There is a new function parameter syntax /
to indicate that some
function parameters must be specified positionally and cannot be used as
keyword arguments. This is the same notation shown by help()
for C
functions annotated with Larry Hastings’
Argument Clinic tool.
Aşağıdaki örnekte, a ve b parametreleri yalnızca konumsaldır, c veya d konumsal veya anahtar sözcük olabilir ve e veya f’nin anahtar sözcük olması gerekir:
def f(a, b, /, c, d, *, e, f):
print(a, b, c, d, e, f)
Aşağıdaki geçerli bir çağrıdır:
f(10, 20, 30, d=40, e=50, f=60)
Ancak, bunlar geçersiz çağrılardır:
f(10, b=20, c=30, d=40, e=50, f=60) # b cannot be a keyword argument
f(10, 20, 30, 40, 50, f=60) # e must be a keyword argument
Bu gösterim için bir kullanım durumu, saf Python fonksiyonlarının mevcut C kodlu fonksiyonlarının davranışlarını tam olarak taklit etmesine izin vermesidir. Örneğin, yerleşik divmod()
fonksiyonu, anahtar kelime bağımsız değişkenlerini kabul etmez:
def divmod(a, b, /):
"Emulate the built in divmod() function"
return (a // b, a % b)
Başka bir kullanım durumu, parametre adı yardımcı olmadığında anahtar kelime bağımsız değişkenlerini engellemektir. Örneğin, yerleşik len()
işlevi len(obj, /)
imzasına sahiptir. Bu, aşağıdaki gibi garip çağrıları engeller:
len(obj='hello') # The "obj" keyword argument impairs readability
Bir parametreyi yalnızca konumsal olarak işaretlemenin başka bir yararı da, parametre adının gelecekte yerel kodunu kırma riski olmadan değiştirilmesine izin vermesidir. Örneğin, statistics
modülünde, dist parametre adı gelecekte değiştirilebilir. Bu, aşağıdaki fonksiyon belirtimi ile mümkün olmuştur:
def quantiles(dist, /, *, n=4, method='exclusive')
...
/
öğesinin solundaki parametreler olası anahtar kelimeler olarak gösterilmediğinden, parametre adları **kwargs
içinde kullanılmaya devam eder:
>>> def f(a, b, /, **kwargs):
... print(a, b, kwargs)
...
>>> f(10, 20, a=1, b=2, c=3) # a and b are used in two ways
10 20 {'a': 1, 'b': 2, 'c': 3}
Bu, rasgele anahtar kelime bağımsız değişkenlerini kabul etmesi gereken fonksiyonlarının ve yöntemlerin uygulanmasını büyük ölçüde basitleştirir. Örneğin, collections
modülündeki koddan bir alıntı:
class Counter(dict):
def __init__(self, iterable=None, /, **kwds):
# Note "iterable" is a possible keyword argument
Tam açıklama için PEP 570 ‘e bakın.
(Pablo Galindo’nun bpo-36540 ‘taki katkısıyla.)
Derlenmiş bayt kodu dosyaları için paralel dosya sistemi önbelleği¶
Yeni PYTHONPYCACHEPREFIX
ayarı ( -X
pycache_prefix
olarak da mevcuttur), örtük bayt kodu önbelleğini, içindeki varsayılan __pycache__
alt dizinleri yerine ayrı bir paralel dosya sistemi ağacı kullanacak şekilde yapılandırır.
Önbelleğin konumu sys.pycache_prefix
içinde rapor edilir (None
, __pycache__
alt dizinlerindeki varsayılan konumu belirtir).
(Carl Meyer’ın bpo-33499 ‘daki katkısıyla.)
Hata ayıklama derlemesi, yayın derlemesiyle aynı ABI’yi kullanır¶
Python artık sürüm veya hata ayıklama modunda oluşturulduğunda aynı ABI’yi kullanıyor. Unix’te, Python hata ayıklama modunda oluşturulduğunda, artık sürüm modunda oluşturulmuş C uzantılarını ve kararlı ABI kullanılarak oluşturulmuş C uzantılarını yüklemek mümkündür.
Release ve hata ayıklama derlemeleri artık ABI ile uyumludur: Py_DEBUG
makrosunu tanımlamak artık tek ABI uyumsuzluğunu ortaya çıkaran Py_TRACE_REFS
makrosunu gerektirmez. sys.getobjects()
fonksiyonunu ve PYTHONDUMPREFS
ortam değişkenini ekleyen Py_TRACE_REFS
makrosu, yeni ./configure --with-trace-refs
derleme seçeneği kullanılarak ayarlanabilir.(Victor Stinner’ın’ bpo-36465 ‘deki katkısıyla.)
Unix’te, Android ve Cygwin dışında C uzantıları artık libpython’a bağlı değildir. Statik olarak bağlı bir Python’un, paylaşılan bir Python kitaplığı kullanılarak oluşturulmuş bir C uzantısını yüklemesi artık mümkün. (Victor Stinner’ın bpo-21536 ‘daki katkısıyla.)
Unix’te, Python hata ayıklama modunda oluşturulduğunda, import artık yayın modunda derlenen C uzantılarını ve kararlı ABI ile derlenen C uzantılarını da arar. (Victor Stinner’ın bpo-36722 ‘deki katkısıyla.)
Python’u bir uygulamaya gömmek için, -lpython3.8
(uygulamayı libpython’a bağlamak) elde etmek için python3-config --libs --embed
seçeneğine yeni bir --embed
seçeneği aktarılmalıdır. Hem 3.8 hem de daha eski sürümleri desteklemek için, önce python3-config --libs --embed
seçeneğini deneyin ve önceki komut başarısız olursa python3-config --libs
(--embed
olmadan) seçeneğine geri dönün.
Python’u bir uygulamaya gömmek için bir pkg-config python-3.8-embed
modülü ekleyin: pkg-config python-3.8-embed --libs
-lpython3.8
içerir. Hem 3.8 hem de daha eski sürümleri desteklemek için, önce pkg-config python-X.Y-embed --libs
komutunu deneyin ve önceki komut başarısız olursa pkg-config python-X.Y --libs
(--embed
olmadan) komutuna geri dönün (X.Y
yerine Python sürümünü yazın).
Öte yandan, pkg-config python3.8 --libs
artık -lpython3.8
içermiyor. C uzantıları libpython’a bağlanmamalıdır (durumları dize tarafından işlenen Android ve Cygwin hariç); bu değişiklik kasıtlı olarak geriye dönük uyumsuzdur. (Victor Stinner’ın bpo-36721 ‘deki katkısıyla.)
kendi kendini belgeleyen ifadeler ve hata ayıklama için f-dizeleri =
desteği¶
f-strings için bir =
tanımlayıcısı eklendi. f'{expr=}'
gibi bir f-dizesi, ifade metnine, eşittir işaretine ve ardından değerlendirilen ifadenin temsiline genişler. Örneğin:
>>> user = 'eric_idle'
>>> member_since = date(1975, 7, 31)
>>> f'{user=} {member_since=}'
"user='eric_idle' member_since=datetime.date(1975, 7, 31)"
Her zamanki f-string biçim belirleyicileri, ifadenin sonucunun nasıl görüntülendiği üzerinde daha fazla kontrol sağlar:
>>> delta = date.today() - member_since
>>> f'{user=!s} {delta.days=:,d}'
'user=eric_idle delta.days=16,075'
=
belirleyicisi, hesaplamaların gösterilebilmesi için ifadenin tamamını görüntüler:
>>> print(f'{theta=} {cos(radians(theta))=:.3f}')
theta=30 cos(radians(theta))=0.866
(Eric V. Smith ve Larry Hastings’in bpo-36817 ‘deki katkılarıyla.)
PEP 578: Python Çalışma Zamanı Denetim Kancaları¶
PEP, Denetim Kancası ve Doğrulanmış Açık Kanca ekler. Her ikisi de Python ve yerel koddan edinilebilir, saf Python kodunda yazılmış uygulamaların ve çerçevelerin ekstra bildirimlerden yararlanmasına izin verirken, aynı zamanda gömücülerin veya sistem yöneticilerinin denetimin her zaman etkin olduğu Python yapılarını dağıtmasına izin verir.
Tüm ayrıntılar için bkz. PEP 578.
PEP 587: Python Başlatma Yapılandırması¶
PEP 587, tüm yapılandırma üzerinde daha hassas kontrol ve daha iyi hata raporlama sağlayan Python Başlatmayı yapılandırmak için yeni bir C API ekler.
Yeni yapılar:
Yeni fonksiyonlar:
Bu PEP ayrıca bu iç yapılara _PyRuntimeState.preconfig
(PyPreConfig
type) ve PyInterpreterState.config
(PyConfig
type) alanlarını ekler. PyInterpreterState.config
, global yapılandırma değişkenlerinin ve diğer özel değişkenlerin yerini alarak yeni referans yapılandırması haline gelir.
Belgeler için Python Başlatma Yapılandırması konusuna bakın.
Tam açıklama için PEP 587 konusuna bakın.
(Victor Stinner’ın bpo-36763 ‘teki katkısıyla.)
PEP 590: Vectorcall: CPython için hızlı arama protokolü¶
Python/C API’sine The Vectorcall Protocol eklendi. Çeşitli sınıflar için zaten yapılmış olan mevcut optimizasyonları resmileştirmeyi amaçlamaktadır. Bir çağrılabilir uygulayan herhangi bir static type bu protokolü kullanabilir.
Bu şu anda geçicidir. Amaç, Python 3.9 ‘da tamamen halka açık hale getirmektir.
Tam açıklama için PEP 590 ‘a bakın.
(Jeroen Demeyer, Mark Shannon ve Petr Viktorin’in katkılarıyla bpo-36974.)
Bant dışı veri tamponlarıyla Pickle protokolü 5¶
Çok çekirdekli veya çok makineli işlemeden yararlanmak amacıyla Python süreçleri arasında büyük verileri aktarmak için pickle
kullanıldığında, bellek kopyalarını azaltarak ve muhtemelen veriye bağlı sıkıştırma gibi özel teknikler uygulayarak aktarımı optimize etmek önemlidir.
pickle
protokolü 5, PEP 3118 uyumlu verilerin iletişim katmanının takdirine bağlı olarak ana pickle akışından ayrı olarak iletilebildiği bant dışı tamponlar için destek sunar.
Tam açıklama için PEP 574 ‘e bakın.
(Antoine Pitrou’nun bpo-36785 ‘teki katkısıyla.)
Diğer Dil Değişiklikleri¶
Bir
continue
ifadesi, uygulamadaki bir sorun nedeniylefinally
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
vefractions.Fraction
türleri artıkfloat
vedecimal.Decimal
türlerinde olduğu gibi biras_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
vecomplex
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 inregular 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
vereturn
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 birSyntaxWarning
görüntüler. Bu, sadece ilk tuple’ın çağrılabilir olmadığını belirten birTypeError
olmasıyla gelişir. (Serhiy Storchaka’nın bpo-15248 ‘deki katkısıyla.)datetime.date
veyadatetime.datetime
vedatetime.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, yenireplace()
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, önce4258𝑥 ≡ 369 (mod 147)
olarak yeniden yazın ve sonra çözün:>>> x = 369 * pow(4258, -1, 147) % 147 >>> y = (4258 * x - 369) // -147 >>> 4258 * x + 147 * y 369
(Mark Dickinson’ın tarafından bpo-36027 ‘deki katkısıyla.)
Dict kavramaları dict değişmezleri ile senkronize edilmiştir, böylece anahtar ilk olarak ve değer ikinci olarak hesaplanır:
>>> # Dict comprehension >>> cast = {input('role? '): input('actor? ') for i in range(2)} role? King Arthur actor? Chapman role? Black Knight actor? Cleese >>> # Dict literal >>> cast = {input('role? '): input('actor? ')} role? Sir Robin actor? Eric Idle
Garantili yürütme sırası atama ifadelerinde yardımcı olur çünkü anahtar ifadesinde atanan değişkenler değer ifadesinde kullanılabilir olacaktır:
>>> names = ['Martin von Löwis', 'Łukasz Langa', 'Walter Dörwald'] >>> {(n := normalize('NFC', name)).casefold() : n for name in names} {'martin von löwis': 'Martin von Löwis', 'łukasz langa': 'Łukasz Langa', 'walter dörwald': 'Walter Dörwald'}
(Jörn Heissler’ın bpo-35224 ‘teki katkısıyla.)
object.__reduce__()
yöntemi artık iki ila altı eleman uzunluğunda bir tuple döndürebilir. Eskiden sınır beşti. Yeni, isteğe bağlı altıncı eleman(obj, state)
imzasına sahip bir çağrılabilirdir. Bu, belirli bir nesnenin durum güncelleme davranışı üzerinde doğrudan kontrol sağlar. Eğer None değilse, bu çağrılabilir öğe nesnenin__setstate__()
yöntemine göre önceliğe sahip olacaktır. (Pierre Glaser ve Olivier Grisel’in bpo-35900 ‘deki katkılarıyla.)
Yeni Modüller¶
Yeni
importlib.metadata
modülü, üçüncü taraf paketlerden meta verileri okumak için (geçici) destek sağlar. Örneğin, yüklü bir paketin sürüm numarasını, giriş noktalarının listesini ve daha fazlasını çıkarabilir:>>> # Note following example requires that the popular "requests" >>> # package has been installed. >>> >>> from importlib.metadata import version, requires, files >>> version('requests') '2.22.0' >>> list(requires('requests')) ['chardet (<3.1.0,>=3.0.2)'] >>> list(files('requests'))[:5] [PackagePath('requests-2.22.0.dist-info/INSTALLER'), PackagePath('requests-2.22.0.dist-info/LICENSE'), PackagePath('requests-2.22.0.dist-info/METADATA'), PackagePath('requests-2.22.0.dist-info/RECORD'), PackagePath('requests-2.22.0.dist-info/WHEEL')]
(Barry Warsaw ve Jason R. Coombs’un bpo-34632 ‘deki katkılarıyla.)
Geliştirilmiş Modüller¶
ast¶
AST düğümleri artık düğümün sonunun kesin konumunu veren end_lineno
ve end_col_offset
niteliklerine sahiptir. (Bu sadece lineno
ve col_offset
niteliklerine sahip düğümler için geçerlidir)
Yeni fonksiyon ast.get_source_segment()
belirli bir AST düğümü için kaynak kodunu döndürür.
(Ivan Levkivskyi’nin bpo-33416 ‘daki katkısıyla.)
ast.parse()
fonksiyonu bazı yeni bayraklara sahiptir:
type_comments=True
, belirli AST düğümleriyle ilişkili PEP 484 ve PEP 526 tipi yorumların metnini döndürmesine neden olur;mode='func_type'
, PEP 484 “imza tipi yorumlarını” (fonksiyon tanımı AST düğümleri için döndürülür) ayrıştırmak için kullanılabilir;feature_version=(3, N)
daha önceki bir Python 3 sürümünü belirtmeye izin verir. Örneğin,feature_version=(3, 4)
,async
veawait
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.)
Windows’ta, yeniden ayrıştırma noktalarını (sembolik bağlantılar ve dizin bağlantıları dahil) işlemek için manuel mantığın çoğu işletim sistemine devredilmiştir. Özellikle, os.stat()
artık işletim sistemi tarafından desteklenen her şeyi geçerken, os.lstat()
yalnızca “isim vekilleri” olarak tanımlanan yeniden ayrıştırma noktalarını açacak, diğerleri ise os.stat()
için olduğu gibi açılacaktır. Her durumda, stat_result.st_mode
sadece sembolik bağlantılar için S_IFLNK
ayarına sahip olacak, diğer türdeki ayrıştırma noktaları için olmayacaktır. Diğer yeniden ayrıştırma noktası türlerini tanımlamak için yeni stat_result.st_reparse_tag
niteliğini kontrol edin.
Windows üzerinde, os.readlink()
artık dizin bağlantılarını okuyabilmektedir. islink()
dizin bağlantıları için False
döndürecektir ve bu nedenle önce islink
kontrol eden kod bağlantıları dizin olarak ele almaya devam ederken, os.readlink()
hatalarını işleyen kod artık bağlantıları linkler olarak ele alabilir.
(Steve Dower’ın bpo-37834 ‘teki katkısıyla.)
os.path¶
exists()
, lexists()
, isdir()
, isfile()
, islink()
ve ismount()
gibi boolean sonuç döndüren os.path
fonksiyonları artık işletim sistemi düzeyinde temsil edilemeyen karakterler veya baytlar içeren yollar için ValueError
veya alt sınıfları UnicodeEncodeError
ve UnicodeDecodeError
yerine False
döndürüyor. (Serhiy Storchaka’nın bpo-33721 ‘deki katkısıyla.)
Windows üzerinde expanduser()
artık USERPROFILE
ortam değişkenini tercih ediyor ve normalde normal kullanıcı hesapları için ayarlanmamış olan HOME
değişkenini kullanmıyor. (Anthony Sottile’nin bpo-36264 ‘deki katkısıyla.)
isdir()
Windows üzerinde artık var olmayan bir dizine bağlantı için True
döndürmüyor.
Windows üzerinde realpath()
artık ortak bağlantılar ve dizin birleşimleri de dahil olmak üzere yeniden ayrıştırma noktalarını çözümlüyor.
(Steve Dower’ın bpo-37834 ‘teki katkısıyla.)
pathlib¶
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¶
tkinter.Spinbox
sınıfına selection_from()
, selection_present()
, selection_range()
ve selection_to()
yöntemleri eklendi. (Juliette Monsel’ın bpo-34829 ‘daki katkısıyla.)
tkinter.Canvas
sınıfına moveto()
metodu eklendi. (Juliette Monsel’ın bpo-23831 ‘deki katkısıyla.)
tkinter.PhotoImage
sınıfı artık transparency_get()
ve transparency_set()
yöntemlerine sahiptir. (Zackery Spytz’in bpo-25451 ‘deki katkısıyla.)
time¶
Added new clock CLOCK_UPTIME_RAW
for macOS 10.12.
(Contributed by Joannah Nanjekye in bpo-35702.)
typing¶
typing
modülü birkaç yeni özellik içerir:
Anahtar başına türleri olan bir sözlük türü. Bakınız PEP 589 ve
typing.TypedDict
. TypedDict yalnızca dize anahtarları kullanır. Varsayılan olarak, her anahtarın mevcut olması gerekir. Anahtarların isteğe bağlı olmasına izin vermek için “total=False” belirtin:class Location(TypedDict, total=False): lat_long: tuple grid_square: str xy_coordinate: tuple
Değişmez tipler. Bakınız PEP 586 ve
typing.Literal
. Değişmez tipler, bir parametrenin veya dönüş değerinin bir veya daha fazla belirli değişmez değerle sınırlandırıldığını gösterir:def get_status(port: int) -> Literal['connected', 'disconnected']: ...
“Final” değişkenler, fonksiyonlar, metotlar ve sınıflar. Bakınız PEP 591,
typing.Final
vetyping.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
vetyping.runtime_checkable()
.typing.SupportsInt
gibi basit ABC’ler artıkProtocol
alt sınıflarıdır.Yeni protokol sınıfı
typing.SupportsIndex
.Yeni fonksiyonlar
typing.get_origin()
vetyping.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
–xml.etree.ElementTree.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ı durumlardaos.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()
veshutil.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 üzerindeshutil.copyfile()
daha büyük bir varsayılan tampon boyutu kullanır (16 KiB yerine 1 MiB) veshutil.copyfileobj()
‘ninmemoryview()
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ıcaos.stat()
sistem çağrılarının sayısı %38 oranında azaltılarakshutil.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
üyesiPyGC_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çinm
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ıkmake 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:
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()
andPyByteArray_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ıkchar *
yerineconst char *
türündedir. (Serhiy Storchaka’nın bpo-33818 ‘deki katkısıyla.)Modules/Setup.dist
veModules/Setup
ikiliği kaldırıldı. Önceden, CPython kaynak ağacını güncellerken, yukarı akıştaki değişiklikleri yansıtmak içinModules/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 vePyArg_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 ancakindex__()
yöntemi olmayan nesneler (Decimal
veFraction
gibi) için verilecektir.PyNumber_Check()
artık__index__()
yöntemini uygulayan nesneler için1
değerini döndürecektir.PyNumber_Long()
,PyNumber_Float()
vePyFloat_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()
yerinePyObject_Init()
(ve paralel makrosuPyObject_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 likePyCode_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 setssys.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 yerinebdist_wheel
(tekerlek paketleri) kullanın. (Victor Stinner’ın bpo-37481 ‘deki katkısıyla.)ElementTree
modülündeki kullanımdan kaldırılangetchildren()
vegetiterator()
yöntemleri artıkPendingDeprecationWarning
yerine birDeprecationWarning
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 nesneyiloop.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 ofxml.dom.pulldom.DOMEventStream
,wsgiref.util.FileWrapper
andfileinput.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
veEllipsis
kullanımdan kaldırılmıştır ve gelecek Python sürümlerinde kaldırılacaktır. YerineConstant
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()
vevisit_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çinvisit_Constant()
yöntemini ekleyin. (Serhiy Storchaka’nın bpo-36917 ‘deki katkısıyla.)asyncio.coroutine()
decorator kullanımdan kaldırılmıştır ve 3.10 sürümünde kaldırılacaktır.@asyncio.coroutine
yerineasync def
kullanın. (Andrew Svetlov’un bpo-36921 ‘deki katkısıyla.)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()
, veasyncio.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.)Aşağıdaki fonksiyonlar ve yöntemler
gettext
modülünde kullanımdan kaldırılmıştır:lgettext()
,ldgettext()
,lngettext()
veldngettext()
. Bunlar kodlanmış baytlar döndürür ve çevrilen dizelerde kodlama sorunları varsa Unicode ile ilgili beklenmedik istisnalar almanız olasıdır. Python 3’te Unicode dizgileri döndüren alternatifleri kullanmak çok daha iyidir. Bu fonksiyonlar uzun süredir bozuk.bind_textdomain_codeset()
fonksiyonu,output_charset()
veset_output_charset()
yöntemleri vetranslation()
veinstall()
fonksiyonlarının codeset parametresi de yalnızcal*gettext()
fonksiyonları için kullanıldığından kullanımdan kaldırılmıştır. (Serhiy Storchaka’nın bpo-33710 ‘daki katkısıyla.)The
isAlive()
method ofthreading.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()
andcurses.wrapper()
.unittest.TestCase.addCleanup()
içindeki fonksiyon.fn içinde
submit()
yöntemiconcurrent.futures.ThreadPoolExecutor
veconcurrent.futures.ProcessPoolExecutor
.contextlib.ExitStack.callback()
,contextlib.AsyncExitStack.callback()
vecontextlib.AsyncExitStack.push_async_callback()
içinde geri arama.c ve typeid öğeleri
multiprocessing.managers.Server
vemultiprocessing.managers.SharedMemoryServer
öğelerinincreate()
yönteminde yer alır.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 fromcollections.abc
. Being able to import from collections was marked for removal in 3.8, but has been delayed to 3.9. (See gh-81134.)Python 3.7’de kullanımdan kaldırılan
macpath
modülü kaldırıldı. (Victor Stinner’ın bpo-35471 ‘deki katkısıyla.)Python 3.3’ten beri kullanımda olmayan
platform.popen()
fonksiyonu kaldırıldı: bunun yerineos.popen()
kullanın. (Victor Stinner’ın bpo-35345 ‘teki katkısıyla.)Python 3.3’ten beri kullanımdan kaldırılan
time.clock()
fonksiyonu kaldırıldı: iyi tanımlanmış davranışa sahip olmak için gereksinimlerinize bağlı olarak bunun yerinetime.perf_counter()
veyatime.process_time()
kullanın. (Matthias Bussonnier’ın bpo-36895 ‘teki katkısıyla.)pyvenv
betiğinin hangi Python yorumlayıcısına bağlı olduğu konusundaki karışıklığı ortadan kaldırmak içinpython3.8 -m venv
betiği lehinepyvenv
betiği kaldırıldı. (Brett Cannon’ın bpo-25427 ‘deki katkısıyla.)parse_qs
,parse_qsl
, andescape
are removed from thecgi
module. They are deprecated in Python 3.2 or older. They should be imported from theurllib.parse
andhtml
modules instead.filemode
fonksiyonutarfile
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
metodunundoctype()
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ünCache
veStatement
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()
vefileinput.FileInput()
anahtar kelime argümanıbufsize
kaldırıldı. bpo-36952 (Matthias Bussonnier’ın katkısıyla.)Python 3.7’de kullanımdan kaldırılan
sys.set_coroutine_wrapper()
vesys.get_coroutine_wrapper()
fonksiyonları kaldırıldı; bpo-36933 (Matthias Bussonnier’ın katkısıyla.)
Python 3.8’e Taşıma¶
Bu bölüm, daha önce açıklanan değişiklikleri ve kodunuzda değişiklik gerektirebilecek diğer hata düzeltmelerini listeler.
Python davranışındaki değişiklikler¶
Yield ifadelerine (hem
yield
hem deyield from
cümleleri) artık anlamalarda ve oluşturucu ifadelerinde (en soldakifor
cümlesindeki yinelenebilir ifadesi dışında) izin verilmemektedir. (Serhiy Storchaka’nın bpo-10544 ‘teki katkısıyla.)Derleyici artık kimlik kontrolleri (
is
veis not
) belirli türdeki değişmezlerle (örneğin dizeler, sayılar) kullanıldığında birSyntaxWarning
ü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ıkobject
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 usesys.platform.startswith('aix')
. (Contributed by M. Felt in bpo-36588.)PyEval_AcquireLock()
andPyEval_AcquireThread()
now terminate the current thread if called while the interpreter is finalizing, making them consistent withPyEval_RestoreThread()
,Py_END_ALLOW_THREADS()
, andPyGILState_Ensure()
. If this behavior is not desired, guard the call by checking_Py_IsFinalizing()
orsys.is_finalizing()
. (Contributed by Joannah Nanjekye in bpo-36475.)
Python API’sindeki değişiklikler¶
os.getcwdb()
fonksiyonu artık Windows’ta ANSI kod sayfası yerine UTF-8 kodlamasını kullanıyor: gerekçe için bkz. PEP 529. İşlev artık Windows’ta kullanımdan kaldırılmamıştır. (Victor Stinner’ın bpo-37412 ‘deki katkısıyla.)subprocess.Popen
artık daha iyi performans için bazı durumlardaos.posix_spawn()
kullanabilir. Linux ve QEMU Kullanıcı Emülasyonu için Windows Alt Sisteminde,os.posix_spawn()
kullananPopen
kurucusu artık “eksik program” gibi hatalarda bir istisna oluşturmuyor. Bunun yerine alt süreç sıfır olmayan birreturncode
ile başarısız olur. (Joannah Nanjekye ve Victor Stinner’ın bpo-35537 ‘deki katkılarıyla.)subprocess.Popen
parametresinin preexec_fn argümanı artık alt yorumlayıcılarla uyumlu değildir. Parametrenin bir alt yorumlayıcıda kullanılması artıkRuntimeError
uyarısı veriyor. (Eric Snow tarafından bpo-34651 ‘de katkıda bulunulmuş, Christian Heimes tarafından bpo-37951 ‘de değiştirilmiştir.)imap.IMAP4.logout()
yöntemi artık keyfi istisnaları sessizce yok saymaz. (Victor Stinner’ın bpo-36348 ‘deki katkısıyla.)Python 3.3’ten beri kullanımda olmayan
platform.popen()
fonksiyonu kaldırıldı: bunun yerineos.popen()
kullanın. (Victor Stinner’ın bpo-35345 ‘teki katkısıyla.)statistics.mode()
fonksiyonu artık çok modlu veriler verildiğinde bir istisna oluşturmuyor. Bunun yerine, girdi verilerinde karşılaşılan ilk modu döndürür. (Raymond Hettinger’ın bpo-35892 ‘deki katkısıyla.)tkinter.ttk.Treeview
sınıfınınselection()
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çinselection_set()
gibi özel yöntemler kullanın. (Serhiy Storchaka’ın bpo-31508 ‘deki katkısıyla.)xml.dom.minidom
metodununwritexml()
,toxml()
vetoprettyxml()
metotları vexml.etree
metodununwrite()
metodu artık kullanıcı tarafından belirtilen öznitelik sırasını korumaktadır. (Diego Rojas ve Raymond Hettinger’ın bpo-34160 ‘daki katkılarıyla.)Bir
dbm.dumb
veritabanı'r'
bayraklarıyla açıldığında artık salt okunurdur.dbm.dumb.open()
,'r'
ve'w'
bayraklarıyla artık mevcut değilse bir veritabanı oluşturmaz. (Serhiy Storchaka’nın bpo-32749 ‘daki katkısıyla.)XMLParser
alt sınıfında tanımlanandoctype()
yöntemi artık çağrılmayacak ve birDeprecationWarning
yerine birRuntimeWarning
yayacaktır. Bir XML doctype bildirimini işlemek için bir hedef üzerindedoctype()
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 birRuntimeError
ortaya çıkıyor. BirDeprecationWarning
Python 3.6–3.7` ‘de yayınlandı (Serhiy Storchaka’nın bpo-23722 ‘deki katkısıyla.)cProfile.Profile
sınıfı artık bir bağlam yöneticisi olarak kullanılabilir. (Scott Sanderson’ın bpo-29235 ‘teki katkısıyla.)shutil.copyfile()
,shutil.copy()
,shutil.copy2()
,shutil.copytree()
veshutil.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 birPyInterpreterState
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ı durumundaNone
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
vexml.sax
modülleri artık varsayılan olarak harici varlıkları işlemiyor. (Christian Heimes’in bpo-17239 ‘daki katkısıyla.)Salt okunur
dbm
veritabanından bir anahtar silindiğinde (dbm.dumb
,dbm.gnu
veyadbm.ndbm
)KeyError
yerineerror
(dbm.dumb.error
,dbm.gnu.error
veyadbm.ndbm.error
) ortaya çıkar. (Xiang Zhang’ın bpo-33106 ‘teki katkılarıyla.)Değişmezler için basitleştirilmiş AST. Tüm sabitler
ast.Constant
örnekleri olarak temsil edilecektir. EskiNum
,Str
,Bytes
,NameConstant
veEllipsis
sınıflarını örneklemek birConstant
örneği döndürecektir. (Serhiy Storchaka’nın bpo-32892 ‘deki katkısıyla.)Windows üzerinde
expanduser()
artıkUSERPROFILE
ortam değişkenini tercih ediyor ve normalde normal kullanıcı hesapları için ayarlanmamış olanHOME
değişkenini kullanmıyor. (Anthony Sottile’nin bpo-36264 ‘deki katkısıyla.)İstisna
asyncio.CancelledError
artıkException
yerineBaseException
‘dan miras alıyor ve artıkconcurrent.futures.CancelledError
‘dan miras almıyor. (Yury Selivanov’un bpo-32528 ‘deki katkısıyla.)asyncio.wait_for()
fonksiyonu artıkasyncio.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 veadd_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 yenireplace()
yöntemi, kodu geleceğe hazır hale getirmek için kullanılabilir.hmac.new()
içindigestmod
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 alanPY_MINOR_VERSION
olarak başlatılmalıdır. Bu alan varsayılan olarak yok sayılır ve yalnızca cf_flags içindePyCF_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: usePyOS_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 yerineRTLD_GLOBAL
ile yüklenmelidir. ÖncedenRTLD_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ı gibilibpython
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ğinPyArg_ParseTuple()
,Py_BuildValue()
,PyObject_CallFunction()
, vb.)PY_SSIZE_T_CLEAN
tanımlanmadan artıkDeprecationWarning
verir. Bu uyarı 3.10 veya 4.0’da kaldırılacaktır. Ayrıntılar için Parsing arguments and building values sayfasını okuyun. (Inada Naoki’nin bpo-36381 ‘teki katkısıyla.)Yığın tahsisli tiplerin örnekleri (örneğin
PyType_FromSpec()
ile oluşturulanlar) tip nesnelerine bir referans tutar. Bu tip nesnelerinin referans sayısının artırılmasıPyType_GenericAlloc()
fonksiyonundan daha düşük seviyeliPyObject_Init()
vePyObject_INIT()
fonksiyonlarına taşınmıştır. Bu,PyType_FromSpec()
aracılığıyla oluşturulan türlerin yönetilen koddaki diğer sınıflar gibi davranmasını sağlar.Statically allocated types etkilenmez.
Durumların büyük çoğunluğu için herhangi bir yan etki olmamalıdır. Ancak, bir örnek tahsis ettikten sonra referans sayısını manuel olarak artıran türler (belki de hatanın etrafında çalışmak için) artık ölümsüz hale gelebilir. Bundan kaçınmak için, bu sınıfların örnek ayırma sırasında tür nesnesi üzerinde Py_DECREF’i çağırması gerekir.
Bu türleri 3.8 ‘e doğru bir şekilde taşımak için lütfen aşağıdaki değişiklikleri uygulayın:
Remove
Py_INCREF
on the type object after allocating an instance - if any. This may happen after callingPyObject_New
,PyObject_NewVar
,PyObject_GC_New()
,PyObject_GC_NewVar()
, or any other custom allocator that usesPyObject_Init()
orPyObject_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, includingtp_finalize
(Py_TPFLAGS_HAVE_FINALIZE
is not checked anymore before readingtp_finalize
).(Antoine Pitrou’nun bpo-32388 ‘deki katkısıyla.)
The functions
PyNode_AddChild()
andPyParser_AddToken()
now accept two additionalint
arguments end_lineno and end_col_offset.MinGW araçlarının doğrudan
python38.dll
dosyasına bağlanmasını sağlayanlibpython38.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ı olangendef
vedlltool
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ındakilibs
dizini olanpythonXY.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
vereturn
için temizleme kodunu çağırmak için açık talimatlar yayınlar.Removed opcodes
BREAK_LOOP
,CONTINUE_LOOP
,SETUP_LOOP
andSETUP_EXCEPT
. Added new opcodesROT_FOUR
,BEGIN_FINALLY
,CALL_FINALLY
andPOP_FINALLY
. Changed the behavior ofEND_FINALLY
andWITH_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 yeniEND_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
, andshutil.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 aDeprecationWarning
. In Python 3.14, the default will switch to'data'
. (Contributed by Petr Viktorin in PEP 706.)