Kategori: python

  • Python’da __future__ modülü ne işe yarar?

    __future__ modülü eski versiyonda yazılmış Python kodu içerisinde yeni versiyon özelliklerini kullanmanızı sağlayan bir modüldür. Yani mesela kullandığınız özelliğin yeni versiyonda başka bir işlevi olsun, __future__ modülünü kullanarak mevcut Python versiyonundaki özelliği değil de daha yeni versiyondaki özelliği kullanmasını söylersiniz.

    Başka bir deyişle, __future__ modülü ile derleyiciye dersiniz ki; mevcut versiyondaki davranışları sergilemek yerine Python’ın standardı haline gelmiş ileri versiyondaki davranışları sergile.

    Örnekler

    Bölme işlemi (from __future__ import division)

    Bölme işlemi sonucu Python 2.x versiyonlarında int dönüyor. Python 3.x versiyonlarında ise float dönüyor. Görelim:

    Python 2.x

    Python 2.7.17 (default, Nov  7 2019, 10:07:09) 
    [GCC 7.4.0] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> 9/4
    2
    

    Python 3.x

    Python 3.6.9 (default, Nov  7 2019, 10:44:02) 
    [GCC 8.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> 9/4
    2.25
    

    Bu noktada varsayılan bölme işleminin Python 2.x içerisinde Python 3.x’deki davranması için from __future__ import division kodunu ekliyoruz:

    Python 2.7.17 (default, Nov  7 2019, 10:07:09) 
    [GCC 7.4.0] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> 9/4
    2
    >>> from __future__ import division
    >>> 9/4
    2.25
    

    Diğer bir örnek: print (from __future__ import print_function)

    Herhalde Python 2.x ile 3.x geçişinde en yaygın karşılaşılan farklılıklardan birisi print olmuştur.

    print Python 2.x’de sadece özel bir anahtar kelime iken Python 3.x’de fonksiyona dönüşüyor. Görelim:

    Python 2.7.17 (default, Nov  7 2019, 10:07:09) 
    [GCC 7.4.0] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> print
    
    >>> from __future__ import print_function
    >>> print
    <built-in function print>
    

    Daha ne örnekler var?

    __future__ modülü ile uygulayabileceğiniz tüm özellikleri aşağıdaki tabloda bulabilirsiniz. feature satırında geçen özellikler optional in satırında belirten Python sürümünde isteğe bağlı olarak geliyor. mandatory in satırında ise artık varsayılan özellik olarak geliyor. effect satırında ise bu özelliklerin “neden” değiştiği ile ilgili kapsamlıca bilgi bulabilirsiniz.

    featureoptional inmandatory ineffect
    nested_scopes2.1.0b12.2PEP 227Statically Nested Scopes
    generators2.2.0a12.3PEP 255Simple Generators
    division2.2.0a23.0PEP 238Changing the Division Operator
    absolute_import2.5.0a13.0PEP 328Imports: Multi-Line and Absolute/Relative
    with_statement2.5.0a12.6PEP 343The “with” Statement
    print_function2.6.0a23.0PEP 3105Make print a function
    unicode_literals2.6.0a23.0PEP 3112Bytes literals in Python 3000
    generator_stop3.5.0b13.7PEP 479StopIteration handling inside generators
    annotations3.7.0b14.0PEP 563Postponed evaluation of annotations

    Bitirirken

    __future__ modülünün en çok nerede işe yarayacağı ile ilgili benim aklıma gelen örnek senaryo şu: Python 2.x’de yazılmış bir koda ekleme yapmanız gerekiyor ve bu kodu gelecekte Python 3.x’e geçirmeyi planlıyorsanız. Bu durumda hazırdaki Python 2.x koduna yeni yapacağınız eklemeleri ileride tekrar Python 3.x’e çevirmekle uğraşmamak için __future__ modülü ile şimdiden Python 2.x içerisinde Python 3.x yazar gibi yazmaya başlayabiliyorsunuz.

    Son

    Stackoverflow yorumlarının bir tanesinde geleceğe dönüş filmine atıfta bulunulmuş. Back to the __future__ 🙂

    Kaynaklar:

  • User Administration (Kullanıcı Yönetimi)

    (Uygulamanın kaynak kodlarına https://github.com/vlyalcin/User-Administration adresinden ulaşabilirsiniz.)

    Kullanıcı Yönetimi sisteminizdeki kullanıcıları yönetmeye yarar. Uygulama temel olarak;

    -Yeni kullanıcı ekler
    -Mevcut kullanıcı bilgilerini düzenler veya siler.
    -Kullanıcı resmini belirler (görüntüyü kameradan veya bilgisayarınızdaki bir resimden alabilir)

    Linux sisteminde kullanıcı bilgileri bir metin dosyası içerisinde saklanıyor (/etc/passwd yapısı hakkında güzel bir kaynak http://www.cyberciti.biz/faq/understanding-etcpasswd-file-format/). Benim yaptığım olay Linux standartlarının dışına çıkmadan bu metin dosyalarını Kullanıcı Yönetimi uygulaması aracılığı ile düzenlemek oldu. Yani benim kazandığım tecrübe ağırlıklı olarak metin dosyası açma, okuma ve düzenleme üzerine oldu. Mevcut kitaplıklar ile çok daha az satır ve çok daha az emek ile basitce kullanıcı oluşturabileceğimin farkındayım. Ben işi el ile yaparak Python ve programlama konusunda tecrübe kazanmak istedim.

    Onun dışında OpenCV’nin bilgisayar kamerasından görüntü alıp kaydetme gibi çok basit bir özelliğini kullandım.

    Parolaları şifreleme ihtiyacı sebebiyle passlib kitaplığı ve şifreleme konusunda deneyim edindim.

    Qt arayüzü ile aşina oldum.

    Uygulamada çeşitli ihtiyaçlar ile içe aktardığım kitaplıklar şu şekilde;
    os, sys, shutil, datetime, Image, cv, python-passlib, PyQt4

    Uygulamayı kaynak koddan “python setup.py install” komutu ile yükledikten sonra /usr/share/user-administration/.backup dizini altına “/etc/passwd”, “/etc/shadow”, “/etc/group” dosyalarının yedeğini alıyor. Bu dosyalar ile ilgili herhangi bir sorun ile karşılaştığınızda yedeği alınan dosyaları ilgili yerlere geri taşıyarak sorunu giderebilirsiniz.

    root olarak yada sudo ile “python setup.py install” komutuyla uygulamayı sisteminize yükledikten sonra komuta satırına tekrar root olarak yada sudo ile “user-administration” komutunu yazarak uygulamayı başlatabilirsiniz
    Kullanıcı resmi durumundan dolayı şimdilik sadece Ubuntuda sağlıklı olarak çalışıyor.

    Uygulama sistem ve kullanıcılar ile ilgili olduğu için farketmeden güvenlik zaafiyeti oluşturmuş olabilirim. Sakıncalı gördüğünüz noktaları uyarmaktan çekinmeyiniz.

    Türkçe desteğini vakit darlığından dolayı oluşturamadım. Fakat kod satırlarındaki yorumlamalarda Türkçe yorumları eksik etmedim.

    Ekran görüntüleri