Python (eski yazılar, sayfa 7)

Bloğu nasıl sunucuya yüklüyorum?

Bu bloğu barındırdığım sunucumda, rsync kullanma ihtimalim yok, çünkü sadece html dosyaları upload edebildiğim bir paket kullanıyorum. SSH erişimi gibi bir şansım yok. Bundan önce dosyaları sunucuya atmak için, filezilla kullanıyordum. Filezilla ile upload yaparken, boyutu farklı ise veya kaynak daha yeniyse upload et gibi bir seçeneği var. Bu az çok işimi görüyordu. Ancak bunun da kendine göre bir takım sıkıntıları var. Bazen output klasörünü silip baştan oluşturma ihtiyacı duyuyorum. Bu gibi durumlarda, çoğu dosyanın içereği aslında değişmemiş olsa bile, tüm dosyaları baştan upload ediyor. Bir de bazen dosyaları yanlış yere atma gibi bir problem yaşıyorum. Geçenlerde anasayfa'nın index sayfası üzerine, başka bir klasörün index sayfasını atmışım mesela, biraz geç farkettim. Ayrıca, önceden attığım ama sonradan sildiğim içeriğin takibi yapmam da mümkün olmuyordu bu şekilde.

Devamını oku…

UnicodeDecodeError - ordinal not in range(128)

UnicodeError, Python 2.x sürümlerinde sıkça karşılaşılan ve Python diline veya programlamaya yeni başlayanların kafasına karıştırabilecek bir hata. Çoğu zaman, python dosyasının kullandığı encoding'i doğru belirtmemekten veya internetten alınan dosyayı doğru encoding'i kullanarak decode etmemekten kaynaklanan bu hata, hatanın doğasını bilmiyorsanız, sizi biraz uğraştırabilir. Bu yazı size bu hatanın neden kaynaklandığını, bundan kaçınmak için neler yapmak gerektiğini ve karşılaşıldığı zaman nasıl çözüleceği gösterecek. Bu yazı, biraz Python bilen başlangıç seviyesindeki programcılara yönelik olacak.

Yazının içeriği:

  • Temel encoding/decoding konseptleri
  • Python str ve unicode objeleri
  • Doğru encoding'i tespit etmek

    Devamını oku…

Parser - Kod Dönüştürme

Parser yazılarını takip ettiyseniz, kaynak kodları parse tree'e çevirebilen bir parser yazmıştık. Bu yazıda, onu biraz daha geliştirip, parse tree'den kod üretmesini sağlayacağız. Kodlar yine aynı yerde.

Daha önce bahsettiğim gibi, parser tree'i birçok farklı şekilde kullanabilirsiniz. Ben kendi parse tree'min kodları C benzeri bir dile çevirmesini istiyorum.

Devamını oku…

Python Paket İstatistikleri

Bu yazıyı, Python Paket Indeksindeki paketlerle ilgili tanıtıcı istatistikler vermek için yazıyorum. Python paket indeksindeki paketlerin sayfalarını indirip, içindeki verileri topladım. 34968 paketin PyPi sayfasını indirdim, bunlardan 34923 tanesinden veri elde edebildim. Python paket indeksinde 35813 paket olduğu rapor ediliyor. Ancak, bunlardan bazıları aynı paketlerin farklı versiyonları. Ben tekil paket son versiyonları ile çalıştım.

Neden böyle birşey yaptım? Merak ve boş zaman...

Devamını oku…

Python Package Statistics

I am writing this in order to give some descriptive statistics about Python Packages in PyPI. I crawled 34968 indiviual package pages on Python package index. I could extract data from 34923 of them. PyPI reports 35813 packages, but some of them are different versions of same packages. I preferred working with latest versions.

Why did I do this? Curiosity and spare time...

Devamını oku…

Parser - Statement

Evet, son bıraktığımızda, Parser'ımız expression'ları parse edebiliyordu. Ancak, henüz tek bir expression parse edebiliyoruz. Bu yazıda, statement'ları nasıl parse edeceğimize değineceğiz.

Önce statement (beyan) nedir, ona biraz değinelim. Statement, expression'dan bir üst kategori diyebiliriz. Her expression, aynı zamanda bir statement olabilir. Ancak, her statement bir expression olamaz. Mesela, programlama dillerindeki if sözcüğü bir statement tanımlar, ama if statement'ı bir expression diyemeyiz.

Statement'ları parse edebilmek için, statement başlatan sembollerimize özel bir std metodu tanımlayacağız. Örneğin, if statement yapmak için gerekli olan sembolü, sembol tablosuna ekleyelim:

Devamını oku…

Python ile parser yapımı

Bu yazıda, Lexical Analiz yazısında anlattığım Lexer'ın üstüne, bir de Parser yapmaya başlayacağız. Parser konusunda genel bilgi almak için, Parsing Kavramı ve Yöntemleri yazısını okuyabilirsiniz.

Öncelikle, izleyeceğimiz yöntemden biraz bahsedeyim. Burada kullanacağımız yöntem, çok orjinal bir yöntem değil aslında. Vaughan Pratt tarafından Recursive Descent ve Operator Precedence yöntemlerinin güzel yanlarını birleştiren bir parse yöntemi, 1973 yılında bir sempozyumda sunuldu. 2007 yılında, Douglas Crockford bu yöntemi kullanarak, Top Down Operator Precedence adında bir yazı yazdı. Bu yazıda, bir javascript parser'ı örnek gösteriliyordu. Bundan esinlenen Fredrik Lundh Simple Top-Down Parsing in Python yazısında, bu yöntemi kullanarak Python'un bir kısmını parse edebilen bir program örneği ve benchmarkları yayınladı. Ben burada, bu yöntemi anlaşılır bir şekilde sunmaya çalışacağım. Bahsi geçen Parser ve Lexer'ın kısmen bitmiş hallerine Lexer-Parser github deposu üzerinden ulaşabilirsiniz.

Devamını oku…