Python iddiası için en iyi uygulama


483
  1. assertYalnızca hata ayıklama amacıyla kullanmak yerine standart kodun bir parçası olarak kullanmakla ilgili bir performans veya kod bakımı sorunu var mı?

    Dır-dir

    assert x >= 0, 'x is less than zero'

    daha iyi veya daha kötü

    if x < 0:
        raise Exception, 'x is less than zero'
  2. Ayrıca, if x < 0 raise errorher zaman olmadan kontrol edilir gibi bir iş kuralı belirlemenin herhangi bir yolu var mı try/except/finally, kod boyunca herhangi bir zamanda x0'dan küçükse assert x < 0, bir işlevin başlangıcında, işlevin herhangi bir yerinde ayarlanmış gibi bir hata ortaya çıkar. x0'dan küçük nerede istisna oluşur?



29
-O ve -OO python parametreleri iddialarınızı ortadan kaldıracaktır. Bu sizin için neyin iyi olduğuna dair düşüncelerinizi yönlendirmelidir.
Peter Lada

4
Thomasz Zielinski'nin bağlantısı koptu, şimdi: mail.python.org/pipermail/python-list/2013-November/660568.html . Eminim pipermail istikrarsız bir kimlik işlevi vardır, ben aynı pipermail içinde aynı niyetle aynı url işaret diğer bağlantıları bulundu.
quodlibetor

3
Durumda mail.python.org/pipermail/python-list/2013-November/660568.html tekrar hamle, en arşivlenir archive.is/5GfiG . Yazının başlığı "Ne zaman assert kullanılır" dır ve Python için en iyi uygulamalar hakkında mükemmel bir yazıdır (gerçekten bir makale) assert.
clacke

Yanıtlar:


144

X fonksiyon boyunca sıfırdan küçük olduğunda otomatik olarak hata atabilme. Sınıf tanımlayıcılarını kullanabilirsiniz . İşte bir örnek:

class LessThanZeroException(Exception):
    pass

class variable(object):
    def __init__(self, value=0):
        self.__x = value

    def __set__(self, obj, value):
        if value < 0:
            raise LessThanZeroException('x is less than zero')

        self.__x  = value

    def __get__(self, obj, objType):
        return self.__x

class MyClass(object):
    x = variable()

>>> m = MyClass()
>>> m.x = 10
>>> m.x -= 20
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "my.py", line 7, in __set__
    raise LessThanZeroException('x is less than zero')
LessThanZeroException: x is less than zero

10
Özellikler tanımlayıcı olarak uygulansa da, ben bunları kullanma örneği olarak adlandırmazdım. Bu, kendilerinin ve özelliklerin bir örneğidir: docs.python.org/library/functions.html#property
Jason Baker

3
Özellikler x ayarlanırken Sınıfım içinde kullanılmalıdır. Bu çözüm çok genel.

113
Oldukça hoş bir cevap, ama soru ile HİÇBİR ŞEY yapmak zorunda ... Deestan veya John Mee'nin cevabını geçerli cevap olarak işaretleyemez miyiz?
Vajk Hermecz

4
Bu, sorunun başlığına cevap vermiyor gibi görünüyor. Ayrıca, bu Python'un sınıf özelliği özelliğine zayıf bir alternatiftir.
Dooms101

10
@VajkHermecz: Aslında, soruyu tekrar okursanız, bu iki soruda birdir. Sadece başlığa bakan insanlar sadece bu cevabın cevaplamadığı ilk soruya aşinadır. Bu cevap aslında ikinci soruya bir cevap içermektedir.
ArtOfWarfare

742

Ekler, asla olmaması gereken koşulları test etmek için kullanılmalıdır . Amaç, programın bozuk olması durumunda erken çökmektir.

Muhtemel olarak meydana gelebilecek hatalar için istisnalar kullanılmalı ve neredeyse her zaman kendi İstisna sınıflarınızı oluşturmalısınız .


Örneğin, bir yapılandırma dosyasından a'ya bir işlev okumak için bir işlev yazıyorsanız dict, dosyada yanlış biçimlendirme a değerini yükseltirken ConfigurationSyntaxError, assertgeri dönmek üzereyken yapabilirsiniz None.


Örneğinizde, xbir kullanıcı arayüzü veya harici bir kaynaktan ayarlanan bir değer varsa , bir istisna en iyisidir.

Eğer xsadece aynı programda kendi koduna göre ayarlanır, bir iddianın ile gitmek.


126
Bu doğru kullanımı iddia yolu. Program akışını kontrol etmek için kullanılmamalıdır.
Thane Brimhall

41
Son paragraf için +1 - açıkassert bir şekilde örtük if __debug__ve optimize edilebileceğinden açıkça bahsetmelisiniz - John
Mee'nin

3
Cevabınızı tekrar okurken, muhtemelen kural olarak asla gerçekleşmesi gerekmeyen koşullar anlamına gelmediğini düşünüyorum , ancak amaç genellikle beklemediğiniz bir koşulla çakışan bozuk bir program durumunda erken çökmek hiç olmadı .
Bentley4

10
assert yalnızca bilinen bir iyileşme olmaksızın sorunları yakalamak için kullanılmalıdır; neredeyse her zaman hataları kodlar (kötü girişler değil). Bir onaylama tetiklendiğinde, programın ağla konuşmaya veya diske yazmaya başlayabileceği için, devam etmek için tehlikeli olabilecek bir durumda olduğu anlamına gelmelidir. sağlam kod, 'atomik olarak' geçerli durumdan kötü (veya kötü amaçlı) giriş karşısında geçerli duruma geçer. her dişin en üst seviyesinde bir arıza bariyeri bulunmalıdır. dış dünyadan girdi tüketen arıza bariyerleri genellikle bariyerin sadece tek bir yinelemesinde başarısız olur (while / try), geri alma / oturum açma hatası.
Rob

10
"Ekler, asla olmaması gereken koşulları test etmek için kullanılmalıdır." Evet. Ve ikinci "olması gereken" in anlamı şudur: Bu olursa, program kodu yanlıştır.
Lutz Prechelt

362

"assert" ifadeleri derleme optimize edildiğinde kaldırılır . Evet, hem performans hem de fonksiyonel farklılıklar var.

Derleme zamanında optimizasyon istendiğinde geçerli kod üreteci bir assert ifadesi için kod yayınlamaz. - Python 2 Dokümanları Python 3 Dokümanları

assertUygulama işlevselliğini uygulamak için kullanırsanız , dağıtımı üretime göre en iyi duruma getirirseniz, "ancak-in-works-in-dev" hatalarıyla karşılaşırsınız.

PYTHONOPTIMIZE ve -O -OO'ya bakın


26
Vaov! Süper önemli not! Asla başarısız olmaması gereken birkaç şeyi kontrol etmek için ekler kullanmayı planlıyordum, başarısızlığı, birilerinin, erişmemeleri gereken verilere erişmek için gönderdikleri verileri çok dikkatli bir şekilde manipüle ettiğini gösterecektir. İşe yaramazdı, ama bir iddia ile girişimlerini hızla kapatmak istiyorum, bu yüzden üretimde optimize edilmiş olan bu amacı ortadan kaldıracaktır. Sanırım onun yerine raisebir tane olacağım Exception. Oh - sadece SuspiciousOperation Exceptionalt sınıfları olan bir isim buldum Django! Mükemmel!
ArtOfWarfare

Bu arada @ArtOfWarfare banditkodunuzu çalıştırırsanız , sizi bu konuda uyaracaktır.
Nagev

132

Dört amacı assert

Dört meslektaşınız Alice, Bernd, Carl ve Daphne ile 200.000 satır kod üzerinde çalıştığınızı varsayın. Kodunuzu çağırıyorlar, kodlarını çağırıyorsunuz.

Sonra assertsahiptir dört rolleri :

  1. Alice, Bernd, Carl ve Daphne'ye kodunuzun ne beklediğini bildirin.
    Bir tuples listesini işleyen bir yönteminiz olduğunu ve bu tuples değişmezse program mantığının kırılabileceğini varsayın:

    def mymethod(listOfTuples):
        assert(all(type(tp)==tuple for tp in listOfTuples))

    Bu, belgelerdeki eşdeğer bilgilerden daha güvenilirdir ve bakımı çok daha kolaydır.

  2. Bilgisayara kodunuzun ne beklediğini bildirin.
    assertkodunuzun arayanlarından uygun davranışı uygular. Kodunuz Alices'in kodunu çağırırsa ve Bernd'ın kodu sizinkini çağırırsa assert, program Alices kodunda çökerse, Bernd bunun Alice'in hatası olduğunu varsayabilir, Alice araştırır ve sizin hatanız olduğunu varsayabilir, araştırırsınız ve Bernd'ın aslında olduğunu söylersiniz onun. Çok iş kaybettim.
    Bir çağrı yanlış yaparsa, iddialar ile hızlı bir şekilde sizin değil, onların hatası olduğunu görebilecekler. Alice, Bernd ve hepiniz faydalanıyorsunuz. Çok fazla zaman kazandırır.

  3. Kodunuzu bir noktada (kendiniz de dahil) okuyucunuza bildirin.
    Girdilerin bir listesine sahip olduğunuzu ve her birinin temiz olabileceğini (hangisinin iyi olduğunu) veya smorsh, trale, gullup veya twinkled (hepsi kabul edilemez) olabileceğini varsayın. Eğer smorsh ise morsed olmamalıdır; trale ise baludoed olmalı; martı ise paçalanmalı (ve muhtemelen de tempolu olmalıdır); eğer parıldandıysa Perşembe günleri hariç yeniden parıldamalı. Fikri anlıyorsunuz: Bu karmaşık şeyler. Ancak sonuç, tüm girişlerin temiz olmasıdır (veya olması gerekir). Yapılacak doğru şey, temizleme döngünüzün etkisini şu şekilde özetlemektir:

    assert(all(entry.isClean() for entry in mylist))

    Bu ifadeler , harika döngünün tam olarak ne elde ettiğini anlamaya çalışan herkes için bir baş ağrısından kurtarır . Ve bu insanların en sık olanı muhtemelen kendiniz olacaksınız.

  4. Bilgisayara bir noktada kodunuzun neler başardığını bildirin.
    Paça çıktıktan sonra buna ihtiyaç duyan bir girişi hızlandırmayı unutursanız assert, gününüzü kurtaracak ve kodunuzun kırılmasından çok daha fazla sevgili Daphne'nin kaçınmasını önleyeceksiniz.

Bana göre, assertiki dokümantasyon amacı (1 ve 3) ve koruma (2 ve 4) eşit derecede değerlidir.
İnsanları bilgilendirmek, bilgisayarı bilgilendirmekten bile daha değerli olabilir , çünkü assertyakalama amaçlarının (durum 1'de) çok yanlış olmasını ve her durumda sonraki hataların çoğunu önleyebilir .


34
5. assert isinstance () değişken değişken tipini bilmek PyCharm (python IDE ) yardımcı, otomatik tamamlama için kullanılır.
Cjkjvfnby

1
Geçerli yürütme zamanında neyin doğru olduğuna ilişkin kendi kendine belge kodu varsayımlarını sunar. Kontrol edilen bir varsayım yorumu.
pyj

9
2 ve 4 ile ilgili olarak: Eklerinizin çok katı olmadığına çok dikkat etmelisiniz. Ayrıca, programınızın daha genel bir ortamda kullanılmasını sağlayan tek şey, iddiaları kendileri olabilir. Özellikle iddia edilen türler python'un ördek tiplemesine karşıdır.
15'te zwirbeltier

9
@Cjkjvfnby Bu blog girişinde anlatıldığı gibi aşırı isinstance () kullanımına dikkat edin: " isinstance () zararlı olarak değerlendirildi ". Artık Pycharm'da türleri belirtmek için docstrings kullanabilirsiniz.
binarysubstrate

2
Sözleşmeyi sağlamak için ekleri bir şekilde kullanmak. Design by Contract en.wikipedia.org/wiki/Design_by_contract
Leszek Zarna

22

Diğer cevaplara ek olarak, kendilerini istisnalar attığını iddia eder, ancak sadece AssertionErrors. Faydacı bir bakış açısından, hangi istisnaları yakaladığınız üzerinde ince taneli kontrole ihtiyaç duyduğunuzda iddialar uygun değildir.


3
Sağ. Arayanda iddia hatası istisnalarını yakalamak aptalca görünebilir.
Raffi Khatchadourian

Çok iyi bir nokta. Sadece makro düzeyindeki orijinal sorulara bakıldığında kolayca gözden kaçabilen bir nüans. Optimizasyon sırasında iddiaların kaldırılmasıyla ilgili bir sorun olmasa bile, ne tür bir hatanın meydana geldiğinin belirli ayrıntılarını kaybetmek hata ayıklamayı çok daha zor hale getirecektir. Şerefe, outis!
cfwschmidt

Cevabınız, AssertionErrorskaba taneli olmanızla tamam olduğunuzda, yakalamak isteyebileceğiniz gibi okunabilir . Gerçekte, onları yakalamamalısınız.
Tomasz Gandor

19

Bu yaklaşımda gerçekten yanlış olan tek şey, iddia ifadelerini kullanarak çok açıklayıcı bir istisna yapmanın zor olmasıdır. Eğer daha basit sözdizimi için arıyorsanız, hatırlıyor olabilir ayrıca böyle bir şey yapmak:

class XLessThanZeroException(Exception):
    pass

def CheckX(x):
    if x < 0:
        raise XLessThanZeroException()

def foo(x):
    CheckX(x)
    #do stuff here

Başka bir sorun, normal durum denetimi için assert kullanmanın, -O bayrağını kullanarak hata ayıklama öğelerini devre dışı bırakmayı zorlaştırmasıdır.


24
Bir iddiaya bir hata mesajı ekleyebilirsiniz. İkinci parametre. Bu onu açıklayıcı yapacak.
Raffi Khatchadourian

10

İngilizce dil kelime assert burada anlamında kullanılır yemin , affirm , avow . "Çek" veya "olması gerektiği" anlamına gelmez . Bu demektir Eğer bir kodlayıcı olarak bir yapıyoruz yeminli ifade burda:

# I solemnly swear that here I will tell the truth, the whole truth, 
# and nothing but the truth, under pains and penalties of perjury, so help me FSM
assert answer == 42

Kod doğruysa, Tek olay uyaranlarını , donanım hatalarını ve benzerlerini engelleme , hiçbir onaylama başarısız olmaz . Bu nedenle programın son kullanıcıya olan davranışı etkilenmemelidir. Özellikle, bir iddia, istisnai programatik koşullar altında bile başarısız olamaz . Hiç olmadı. Böyle bir durumda, programcı bunun için zaptedilmelidir.


8

Daha önce de belirtildiği gibi, kodunuz hiç bir noktaya ÇIKMAMASI durumunda onaylar kullanılmalıdır, yani orada bir hata vardır. Bir iddiayı kullanmak için görebildiğim en yararlı neden muhtemelen değişmez / ön / son koşul. Bunlar, bir döngü veya işlevin her yinelemesinin başında veya sonunda doğru olması gereken bir şeydir.

Örneğin, özyinelemeli bir işlev (2 ayrı işlev, böylece 1 kötü girişi ve diğer kötü kodu işler, özyineleme ile ayırt etmek zorlaşır). Bu, if ifadesini yazmayı unutursam, neyin yanlış gittiğini açıklığa kavuşturacaktır.

def SumToN(n):
    if n <= 0:
        raise ValueError, "N must be greater than or equal to 0"
    else:
        return RecursiveSum(n)

def RecursiveSum(n):
    #precondition: n >= 0
    assert(n >= 0)
    if n == 0:
        return 0
    return RecursiveSum(n - 1) + n
    #postcondition: returned sum of 1 to n

Bu döngü değişmezleri genellikle bir iddia ile temsil edilebilir.


2
Bu en iyi dekoratörler ile yapılır (@precondition ve @postcondition)
Caridorc

@Caridorc bunun somut yararı nedir?
Chiel ten Brinke

@ChieltenBrinke kendi kendini belgeleyen kod ve yerine #precondition: n >= 0 bir iddia, sadece yazabilir@precondition(lambda n: n >= 0)
Caridorc

@Caridorc O zaman bu yerleşik dekoratörler mi? Ve bundan nasıl belgesel üretilir?
Chiel ten Brinke

@ChieltenBrinke yerleşik değildir ancak uygulaması kolaydır stackoverflow.com/questions/12151182/… . Belgeler __doc__için ek bir dize vererek niteliği
yamanız yeterlidir

4

bir performans sorunu var?

  • Lütfen "hızlı çalışmasını sağlamadan önce çalışmasını sağlayın" .
    Herhangi bir programın yüzde çok azı genellikle hızı ile ilgilidir. assertBir performans sorunu olduğunu kanıtlarsa her zaman başlayabilir veya basitleştirebilirsiniz - ve çoğu asla olmayacaktır.

  • Pragmatik olun :
    Boş olmayan bir tuples listesini işleyen bir yönteminiz olduğunu ve bu tuples değiştirilemezse program mantığının kırılacağını varsayın. Yazmalısınız:

    def mymethod(listOfTuples):
        assert(all(type(tp)==tuple for tp in listOfTuples))

    Listeleriniz on giriş uzunluğundaysa, bu muhtemelen iyidir, ancak bir milyon girişleri varsa sorun olabilir. Ancak bu değerli kontrolü tamamen atmak yerine,

    def mymethod(listOfTuples):
        assert(type(listOfTuples[0])==tuple)  # in fact _all_ must be tuples!

    Bu ucuz ama muhtemelen gerçek program hatalarının çoğunu yakalayacak .


2
Olmalı assert(len(listOfTuples)==0 or type(listOfTyples[0])==tuple).
osa

Hayır, olmamalı. Bu çok daha zayıf bir test olacaktır, çünkü artık ikinci iddianın kontrol ettiği 'boş olmayan' özelliği kontrol etmemektedir. (Birincisi olmamasına rağmen yapmaz.)
Lutz Prechelt

1
İkinci iddia boş olmayan özelliği açıkça kontrol etmez; bu daha çok bir yan etkidir. Listenin boş olması nedeniyle bir istisna ortaya çıkarsa, kodla çalışan kişi (başka biri veya yazar, yazdıktan bir yıl sonra) ona bakıp, iddianın gerçekten yakalanıp yakalanmadığını anlamaya çalışıyordu. boş liste durumu veya bu iddia sahibinin kendisinde bir hata varsa. Dahası, boş kasayı kontrol etmemenin "çok daha zayıf" olduğunu görmüyorum, oysa sadece ilk öğenin kontrol edilmesi "% 97 doğru".
osa

3

Bu açık bir sorudur ve üzerinde durmak istediğim iki yönü var: ne zaman iddialar ekleyeceğim ve hata mesajlarını nasıl yazacağım.

amaç

Bunu yeni başlayanlara açıklamak - iddialar hataları artırabilecek ifadelerdir, ancak onları yakalamayacaksınız. Ve normalde yetiştirilmemelidirler, ancak gerçek hayatta bazen yine de kaldırılırlar. Ve bu, 'ölümcül hata' dediğimiz kodun kurtarılamadığı ciddi bir durumdur.

Daha sonra, doğru olsa da çok küçümseyici olan 'hata ayıklama amaçları' içindir. Farklı yeni başlayanlarda farklı şekilde çalışmasına rağmen 'asla ihlal edilmemesi gereken' formülasyonu daha iyi tanımlamamı seviyorum ... Bazıları 'sadece olsun' ve diğerleri bunun için herhangi bir fayda bulamıyor veya normal istisnaları değiştiriyor, hatta akışını bile kontrol edebilir.

stil

Python'da assertbir ifade değil, bir işlevdir! (hatırlamayacaksınız assert(False, 'is true'). Ama bunu yoldan çıkarmak:

İsteğe bağlı 'hata mesajı' ne zaman ve nasıl yazılır?

Bu acually sık (iddialarını yapmak için birçok özel yöntemleri var ünite test çerçeveler için geçerlidir assertTrue(condition), assertFalse(condition), assertEqual(actual, expected)vs.). Ayrıca, genellikle iddiayı yorumlamak için bir yol sağlarlar.

Uzaklaştırma kodunda hata mesajları olmadan yapabilirsiniz.

Bazı durumlarda, iddiaya eklenecek hiçbir şey yoktur:

def dökümü (bir şey): iddia isinstance (bir şey, Dumpable) # ...

Ancak bunun dışında, bir mesaj diğer programcılarla (bazen kodunuzun etkileşimli kullanıcıları olan, örneğin Ipython / Jupyter vb.) İletişim için yararlıdır.

Onlara sadece iç uygulama ayrıntılarını sızdırmayan bilgiler verin.

onun yerine:

assert meaningless_identifier <= MAGIC_NUMBER_XXX, 'meaningless_identifier is greater than MAGIC_NUMBER_XXX!!!'

yazmak:

assert meaningless_identifier > MAGIC_NUMBER_XXX, 'reactor temperature above critical threshold'

hatta belki:

assert meaningless_identifier > MAGIC_NUMBER_XXX, f'reactor temperature({meaningless_identifier }) above critical threshold ({MAGIC_NUMBER_XXX})'

Biliyorum, biliyorum - bu statik bir iddia için bir durum değil, ama mesajın bilgi değerine işaret etmek istiyorum.

Olumsuz mu, olumlu mesaj mı?

Bu tartışmalı olabilir, ancak aşağıdaki gibi şeyleri okumak bana acı veriyor:

assert a == b, 'a is not equal to b'
  • bunlar birbirinin yanında yazılan iki çelişkili şeydir. Kod tabanı üzerinde her bir etkiye sahip olduğumda, ne istemediğimizi belirtmek için 'zorunluluk' ve 'zorunluluk' gibi ekstra fiiller kullanarak ne istediğimizi belirtmeye çalışırım.

    a == b, 'a b'ye eşit olmalı'

Daha sonra, alma AssertionError: a must be equal to bda okunabilir ve ifade kodda mantıklı görünür. Ayrıca, geri izlemeyi okumadan bir şey elde edebilirsiniz (hatta bazen mevcut olmayabilir).


1

Hem assertistisnaların kullanımı hem de istisnaları iletişim ile ilgilidir.

  • İddialar , geliştiricilere yönelik kodun doğruluğuna ilişkin ifadelerdir : Koddaki bir iddia, kodun doğru olması için yerine getirilmesi gereken koşullar hakkında okuyucuyu kodu bilgilendirir. Çalışma zamanında başarısız olan bir iddia, geliştiricilere kodda düzeltilmesi gereken bir hata olduğunu bildirir.

  • İstisnalar, çalışma zamanında meydana gelebilecek ancak orada işlenecek çağrı kodunda ele alınan, kod tarafından çözülemeyen tipik olmayan durumlarla ilgili göstergelerdir. Bir istisna oluşması, kodda bir hata olduğunu göstermez.

En iyi pratik

Bu nedenle, çalışma zamanında belirli bir durumun ortaya çıkmasını geliştiricilere ("Merhaba geliştirici, bu koşul bir yerde bir hata olduğunu gösterir, lütfen kodu düzeltin.") Bildirmek istediğiniz bir hata olarak görürseniz. bir iddiaya varmak. İddia kodunuzun giriş argümanlarını kontrol ederse, giriş argümanları bu koşulları ihlal ettiğinde tipik olarak kodunuzun "tanımlanmamış davranış" olduğunu belgelemelisiniz.

Bunun yerine, bu durumun ortaya çıkması gözlerinizdeki bir hatanın göstergesi değilse, bunun yerine müşteri kodu tarafından ele alınması gerektiğini düşündüğünüz (belki nadir ancak) olası bir durum, bir istisna oluşturur. İstisnanın ortaya çıktığı durumlar, ilgili kodun belgelerinin bir parçası olmalıdır.

Kullanırken bir performans [...] sorunu var mı assert

İddiaların değerlendirilmesi biraz zaman alır. Ancak derleme zamanında elimine edilebilirler. Ancak bunun bazı sonuçları vardır, aşağıya bakınız.

Kullanırken [...] kod bakım sorunu var mı assert

Normalde iddialar, varsayımları açık hale getirerek ve çalışma sırasında bu varsayımları düzenli olarak doğrulayarak okunabilirliği geliştirdiği için kodun sürdürülebilirliğini artırır. Bu aynı zamanda regresyonları yakalamaya yardımcı olacaktır. Ancak akılda tutulması gereken bir konu var: İddialarda kullanılan ifadelerin yan etkileri olmamalıdır. Yukarıda belirtildiği gibi, derlemeler sırasında iddialar ortadan kaldırılabilir - bu da potansiyel yan etkilerin ortadan kalkacağı anlamına gelir. Bu - istemeden - kodun davranışını değiştirebilir.


1

Assert aşağıdakileri kontrol etmektir:
1. geçerli koşul,
2. geçerli ifade,
3. gerçek mantık;
kaynak kodu. Tüm projenin başarısız olması yerine, kaynak dosyanızda bir şeyin uygun olmadığı konusunda bir alarm verir.

Örnek 1'de, 'str' değişkeni boş olmadığından. Dolayısıyla hiçbir iddia ya da istisna ortaya çıkmaz.

Örnek 1:

#!/usr/bin/python

str = 'hello Python!'
strNull = 'string is Null'

if __debug__:
    if not str: raise AssertionError(strNull)
print str

if __debug__:
    print 'FileName '.ljust(30,'.'),(__name__)
    print 'FilePath '.ljust(30,'.'),(__file__)


------------------------------------------------------

Output:
hello Python!
FileName ..................... hello
FilePath ..................... C:/Python\hello.py

Örnek 2'de var 'str' boştur. Bu yüzden kullanıcıyı iddia beyanı ile hatalı programın önüne geçmekten kurtarıyoruz .

Örnek 2:

#!/usr/bin/python

str = ''
strNull = 'NULL String'

if __debug__:
    if not str: raise AssertionError(strNull)
print str

if __debug__:
    print 'FileName '.ljust(30,'.'),(__name__)
    print 'FilePath '.ljust(30,'.'),(__file__)


------------------------------------------------------

Output:
AssertionError: NULL String

Hata ayıklama istemediğimiz ve kaynak koddaki onaylama sorununu gerçekleştirdiğimiz an. Optimizasyon bayrağını devre dışı bırak

python -O assertStatement.py
hiçbir şey yazdırılmayacak


0

PTVS, PyCharm, Wing assert isinstance()ifadeleri gibi IDE'lerde, bazı belirsiz nesneler için kod tamamlamayı etkinleştirmek üzere kullanılabilir.


Bu, tür ek açıklamalarının veya türlerinin kullanılmasından önce görünmektedir typing.cast.
Acumenus

-1

Değeri ne olursa olsun, assertdüzgün çalışmaya dayanan bir kodla uğraşıyorsanız , aşağıdaki kodu eklemek, eklerin etkinleştirilmesini sağlayacaktır:

try:
    assert False
    raise Exception('Python assertions are not working. This tool relies on Python assertions to do its job. Possible causes are running with the "-O" flag or running a precompiled (".pyo" or ".pyc") module.')
except AssertionError:
    pass

2
Bu OP'nin en iyi uygulamalarla ilgili sorusuna cevap vermiyor.
codeforester
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.