Koşullu İfadeler Hatalı mı?

Merhaba…
Önceki konularımda(1,2) güncelleme ile ilgili kafanızın etini yemiş olabilirim. Onun için kusura bakmayın :slight_smile:

Şimdi yüzdüm yüzdüm kuyruğuna geldim. Geldim gelmesine ama, gıcık bir hata ile karşılaştım(hata bile denmeyebilir). Ufak bir örnekle izah edeyim:

versiyon = "0.1.0"
versiyon2 = "0.1.0"

if versiyon != versiyon2:
    print("güncelleme var")
elif versiyon == versiyon2:
    print("Güncel")

Üstte de gördünüz gibi bir örnek yaptığımda bana Güncel çıktısını veriyor. Tamam bunda hepimiz hemfikiriz…

Geliyorum şimdi asıl sorunuma:

from urllib.request import urlopen

def update():
    guncel_url = "https://raw.githubusercontent.com/Arif-Helmsys/test/main/guncel_url.py"
    versiyon_url = "https://raw.githubusercontent.com/Arif-Helmsys/test/main/version.txt"
    __version__ = "0.1.0"

    url1 = urlopen(url=guncel_url)
    url2 = urlopen(url=versiyon_url)

    if __version__ != url2:
        print("güncel değil\nGüncelleştiriliyor")
        with open("eski.py", "wb") as f:
            for i in url1:
                f.write(i)
    elif __version__ == url2:
        print("Zaten Güncel")

update()

Burda yazdığıma göre __version__ adlı değişken url2 adlı değişkene eşit değil ise güncelle(buraya kadar her şey çok güzel), eşitse Zaten Güncel yazısını ekrana yazdırmak. İşte sorunda tam burada oluyor. elif __version__ == url2: bloğu sanki es geçilmiş gibi oluyor ve __version__ == url2 olsa dahi okumadan tekrardan eşit değilmişcesine güncelleme işlemini yapıyor. Bunu nasıl çözebilirim.
(versiyon_url’nin linkini koyuyorum orada da görebilirsiniz ki __version__ile yazılan numaralar aynı)

Teşekkür ediyorum şimdiden…

url2’nin çıktısı nasıl oluyor onu yazabilir misin? Ve de type(url2) == type(__Version__) onu da bir kontrol edebilir misin?

sırasıyla

print(url2)
print(type(url2))
print(type(__version__))
<http.client.HTTPResponse object at 0x00000296CCA6A520>
<class 'http.client.HTTPResponse'>
<class 'str'

burada demek istediğiniz sanırım şu:

    if type(url2) == type(__version__):
        return True
    else:
        return False

Bunun sonucu ekranda herhangi bir belirti olmuyor

$ python
Python 3.9.2 (default, Feb 20 2021, 18:40:11) 
[GCC 10.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from urllib.request import urlopen
>>> url = urlopen(url = "https://raw.githubusercontent.com/Arif-Helmsys/test/main/version.txt")
>>> version1 = url.read()
>>> version1
b'0.1.0\n'
>>> version2 = b'0.1.0\n'
>>> version1 == version2
True
>>>  

Merhaba, yukarıdaki gibi yaparsan sanırım amacına ulaşmış olursun diye düşünüyorum.

Kaynak

İkinci olarak söylemek istediğim bir şey daha var. Eğer if else bloglarında mantık hatası olduğunu falan düşünüyorsan (hatta bazen düşünmüyorsan bile) @Gok_Mavisi_Anka nın cevapta yazdığı gibi kodunu print ile falan debug edebilirsin. Çok işe yarar :slight_smile:

1 Beğeni

hocam dediğiniz yöntemi yaptım gayet güzel fakat bu sefer
__version__ = b'0.1.0\n' olunca yani linkteki ile aynı sayı olduğunda None yazıyor ekranda.
Şöyle toparlayıp sizin gösterdiğiniz şekilde yazdığımda:

from urllib.request import urlopen

def update():
    guncel_url = "https://raw.githubusercontent.com/Arif-Helmsys/test/main/guncel_url.py"
    versiyon_url = "https://raw.githubusercontent.com/Arif-Helmsys/test/main/version.txt"
    __version__ = b'0.1.0\n' # gösterdiğiniz gibi yaptığım kısım 1

    url1 = urlopen(url=guncel_url)
    url2 = urlopen(url=versiyon_url)
    if __version__ == url2: #   __version__  ile aynı olduğunda print olarak "Güncel" yazmalı fakat yazmıyor ve de güncellemiyor
        print("Güncel")
    elif __version__ < url2.read(): # gösterdiğiniz gibi yaptığım kısım 2
        print("güncel değil\nGüncelleştiriliyor")
        with open("eski.py", "wb") as f:
            for i in url1:
                f.write(i)
print(update())

print(update())

None

Sadece if bloğunda belirttiğim sorun kaldı hocam Güncellememesi gerek evet o gayet iyi oluyor fakat ekrana neden yazmıyor

if bloguna dikkatlice bak url2.read() yerine url2 yazmışsın.

version2 = url2.read()
if version == version2:

else:

Şeklinde olursa daha okunaklı olur bence.

2 Beğeni

hahahahaaaa kusuruma bakmayınnn… Çok teşekkür ederim zaman ayırıp emek verdiğiniz için…

1 Beğeni

Estağfurullah ben teşekkür ederim. İyi çalışmalar

ya hocam versiyonu değiştirince yine none diyor ne yapmalıyım acaba

Çünkü read iki kere çalışınca boş byte dönüyor. Oradaki read methodunu dosya okuma gibi düşün. Birinci read de tüm içeriği okuyor ve tabiri caizse dosya imleci sona geliyor. İkinci read çalıştığında ise o imlecin ilerisinde okuyacak bir şey bulamıyor.

1 Beğeni

Fonksiyonda herhangi bir return ifadesi olmadığından dolaylı olarak None döndürülüyor. Siz de print(update()) dediğinizde fonksiyonun döndürdüğü None değerini yazdırıyorsunuz (yani print(None)'a denk geliyor; fonksiyonun sonuna return 8 yazarsanız da 8 görülür ekranda).

1 - print(update()) ile amacınız tam olarak nedir: print ile return farklı amaçlara hizmet ediyorlar onu belirtmek gerekir.

2 - Yukarıda bahsedilen read'i ardı ardına çağırmamayı hesaba kattınız mı, kodunuzun son halini buraya aktarmanız mümkün müdür? read'in döndürdüğünü bir değişkene atıyor ve öyle kontrol ediyorsunuz değil mi? (İlk read'den sonra boş byte dönüyor.)

3 - Opsiyonel olarak read'in döndürdüğü bytes objesini .decode() ile string’e dönüştürebilirsiniz (manipüle etmesi daha doğal diye düşündüm binary veri değil de tekst verisi diye). Daha da opsiyonel olan ardına rstrip("\n") atarak olası sayfa sonu yeni-satırından kurtulmaktır. Bunlar sonrası karşılaştırma __version__ == "0.1.0" diye yapılabilir.

1 Beğeni

Ben gitmiş None dönüyor demişim yanlışlıkla, kasteddiğim buydu, düzeltmen için eyvallah(düzelttim :+1:), koda üstünkörü bakınca oradaki printi görememişim. Teşekkürler

1 Beğeni