IronPython: .Net üzerinde Python - Bölüm - 2

0
zekzekus
Makalenin 1. bölümü için tıklayınız. Yazının özgün haline bu adresten ulaşabilirsiniz.

Python .NET ile buluşuyor.

Eğer hem Python hem de .NET'e aşinaysanız bazı problemleri hemen farkedebilirsiniz. Yeni başlayanlar için belirtelim Python, .NET içinde tam karşılığı olmayan -bahsettiğimiz liste tipi gibi- gömülü veri tiplerine sahiptir.

Merak etmeyin; bütün bunlar halledilmiş durumda. Ama önce bir örnek yapalım. IronPython, aynı klasik Python yorumlayıcısı gibi çalışan bir konsol programı ile birlikte gelir.

IronPython'ı kurduktan sonra, kurulum klasörünü sistem yoluna (PATH) ekleyin. Komut satırında
    ironpythonconsole
yazın ve konsolu çalıştırın. (Biliyorum biraz uzun bir isim. Bununla ilgili bir düzeltme yapılabilir.)

Bazen IronPython konsolunun başlaması biraz zaman alabilir, çünkü yüklenmesi gereken .NET framework vardır. Konsol başladığında artık Python kodları girmeye hazırsınız. ">>>" karakterleri komut satırınızı ifade eder. İşte örnek bir IronPython oturumu:

C:\>ironpythonconsole
IronPython 1.0.2378 (Beta) on .NET 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.
>>> a = 'hello'
>>> b = 1
>>> b + 3
4
>>> a.upper()
'HELLO'
>>>
Bir önceki bölümde verdiğim kod örneği tam olarak klasik bir Python (CPython) sisteminde yapması beklenen işlemleri yapar. Denemek için önceki örneğin kodunu .py uzantısı ile bir dosyaya kaydedin (ben dosyama demo1.py adını verdim). IronPython konsolunda import demo1.py komutunu vererek çalıştırın:
>>> import demo1
10
python is great
Sam=80
>>>
Fena değil! Fakat burada gerçekten ne olmaktadır? Haydi bunun üzerinde biraz düşünelim: IronPython sonuç olarak C# ile yazılmış büyük bir program. Peki IronPython sadece C#'a port edilmiş bir Python yorumlayıcısı mı? Hayır değil. Eğer durum böyle olsaydı, sadece, .NET hakkında hiçbirşey bilmeyen bir Python yorumlayıcısı çalıştırıyor olurdum. Sadece .NET dilinde yazılmış bir yorumlayıcı. Ama durum böyle değildir.

IronPython, size aynı zamanda Common Language Runtime (CLR) sınıfları yaratma imkanı verir. Başka bir deyişle, IronPython .NET desteği içeren bir Python yorumlayıcısıdır. İlginç.

Pekala, oluşturduğum MyClass sınıfı ile ilgili neler olmaktadır? Bu sadece bir sınıf mıdır, yoksa bir aynı zamanda bir CLR sınıfı mıdır? Öntanımlı olarak sınıf otomatik olarak bir CLR sınıfı olmaz. Ama bunu yapmak oldukça kolaydır. Sadece sınıfı tüm .NET sınıflarının temel sınıfı olan System.Object sınıfından türetmeniz yeterlidir. Bunu yapabilmek için System isimuzayını sisteminize dahil etmeniz gerekir. Konsolunuza yapıştırabileceğiniz örnek kod hemen burada:

import System

class MyClass(System.Object):
    def __init__(self, name, height):
        self.name = name
        self.height = height
    def __str__(self):
        return "%s=%s"%(self.name, self.height)

b = MyClass('Angie', 66)
t = b.GetType()
print t.FullName

Bu kod, önceki sınıf ile aynı özelliklerde bir sınıf yaratır. Fakat sınıfı System.Object nesnesinden türetmiştir. Sınıfı tanımladıktan sonra sınıfın bir örneğini oluşturur ve bunu "b" değişkeninde depolar. Ardından sınıfın GetType metodu çağrılır. Fakat GetType da nedir? Bu System.Object sınıfından kalıtımla gelen bir fonksiyondur ve tüm .NET sınıflarında mevcuttur. Bir .NET sınıfı olan Type tipinde bir nesne döndürür. Bu nesnenin FullName metodunu kullanarak yeni .NET sınıfımın tam adını öğrenebilirim.

Kodun çıktısı şöyle olacaktır:

IronPython.NewTypes.System.Object_1

Aha! MyClass isimli sınıfım sonuçta bir .NET tipi oldu ve IronPython.NetTypes.System adında garip bir isimuzayında yaşıyor. Ama en sondaki Object_1 nedir? Bu .NET içinde varolan yeni veritipimin gerçek adıdır.

Ç.N.: IronPython 1.0.1 sürümüne geldiğinde artık konsol programı ipy.exe olarak adlandırılmıştır.

Çeviri: Zekeriya KOÇ

Reprinted from DevSource.com, a Ziff Davis Media property, all rights reserved, Ziff Davis Media, 28 East 28th St., New York, NY, USA

Görüşler

0
FZ
Elinize sağlık. Her şeyi devletten beklemiyor, terbiyeniz ve çalışkanlığınızla bizi utandırmaya devam ediyorsunuz :)

Birkaç eleştiri:

"Eğer hem Python hem de .NET'e aşinaysanız bazı problemleri hemen farkedebilirsiniz." cümlesinin sonunda "fark etmek" fiili bitişik değil ayrı yazılmalı.

"IronPython konsolunda import demo1.py komutunu vererek çalıştırın:" denmiş ama hemen ardından gelen ekran görüntüsünde sadece "import demo1" yazıyor, .py uzantısı yok. Neden? Hangisi doğru?

"Peki IronPython sadece C#'a port edilmiş bir Python yorumlayıcısı mı?" cümlesi bence biraz problemli. C# ile yazılmış demek ile C#'a 'port edilmiş' demek aynı şey midir? Bir dil başka bir dile 'port' edilebilir mi? 'Port etmek' yerine Türkçe bir tabir kullanabilir miyiz?

"hiçbirşey" yazılmış, "hiçbir şey" olmalı idi.

"Namespace" için "isimuzayı" şeklinde bir bitişik sözcük önermişsiniz. Başka alternatifleriniz de var mıydı? Ya da var mı?

Teknik bir soru: Bir IronPython sınıfı yaratınca eğer istersek ayrıca System.Object'ten miras aldığını belirtmemiz gerekiyor, bunu otomatik yapmanın bir yolu var mı? Yani Common Lisp'tekine benzer bir makro yapısı var mı Python'da? Yani myclassdef BirSinifIsmi... diye bir şey yazıp o BirSinifIsmi isimli sınıfın otomatik olarak System.Object'i atası kabul etmesini sağlayabilir miyim?

"Reprinted from DevSource.com, a Ziff Davis Media property, all rights reserved, Ziff Davis Media, 28 East 28th St., New York, NY, USA" ifadesi de çevrilse olmaz mı?
0
tongucyumruk
"myclassdef BirSinifIsmi..." diye birşey olmuyor ne yazık ki, ancak "decorator" denen yapılar var. Bunları kullanarak şu tarz birşeyler yazmak mümkün olabilir:

@dotnetclass
class hede:
...

"Reprinted from DevSource.com, a Ziff Davis Media property, all rights reserved, Ziff Davis Media, 28 East 28th St., New York, NY, USA" ifadesini çevirebiliriz tabii fakat yasal sebeplerden dolayı ingilizce halini yine de yayınlamamız gerekir. Hem Türkçe hem İngilizce halinin bulunması da karışıklıklara yol açıp insanları yanlış yönlendirebileceğinden sadece ingilizce halini yayınlamak daha sağlıklı bir hareket olur.
0
FZ
Anladım, yani "uniform" bir sözdizimi koruyamıyoruz ekstra süs püs katmak gerekiyor :) Python'un daha da ilerlemesi ve bazı mevcut dillerin vardığı üst seviyelere varması ümidi ile, başarılar.
0
kamilbas
class A(B):

   ...

yazmak yerine

@super(B)

class A:

   ...

yazmak ve satırlar sürecek bir super() decorator'u kodlamak saçma.

Ayrıca, inherit edilen sınıf adlarını yazmak çok mu zor da böyle bir özelliğe ihtiyaç duyuluyor program yazarken?

Bir programlama dili ile ilgili tartışmada, insanların kendi favori dilleri ile ortaya atlayıp, o dilde olan ancak asıl konuda adı geçen dilde olmayan gereksiz bir özellikten bahsetmesi ve konuyu başka yerlere çekmesi de ayrı bir saçmalık.

0
tongucyumruk
Sadece üst sınıfını ayarlamak için böyle birşey yapmak çok mantıklı değil, evet. Fakat ya geliştirdiğiniz uygulama web tabanlı bir uygulama ise? Ya aynı zamanda bu fonksiyonu bir XML-RPC arayüzü vasıtasıyla yayınlanmak üzere biryerlere register etme işini de yapıyorsa?

Evet, sadece üst sınıf atamak için decorator yazmak belki anlamsızdır. Fakat yazdığınız decorator Metaclass'lar yardımıyla çok daha fantastik işler yapmanıza izin veriyorsa bence bir dile eklenebilecek en güzel özelliklerden biridir...
0
FZ
Bir işi yapmanın çeşitli yöntemleri olduğunu düşünüyorum. Bunlardan biri, tekrar etmektir. Ancak malum, biz programcılar genel olarak tembelliğimizle övünürüz ve bir şey belli bir örüntüye (pattern) sahipse onu otomatiğe bağlayıvermeyi erdemlerimiz arasında sayarız. .NET temel sınıfından türetmek istediğim her seferinde class BirSiniftirBu(System.Object): ... yazmak yerine misal netclass diye bir şey tanımlasam ve bunu bir kez yapsam ondan sonra türlü çeşit yerde, projede, vs. netclass BirSiniftirBu: ... dediğimde bu otomatik olarak class BirSiniftirBu(System.Object)'e dönüştürülse bunun bana zararı olacağını düşünmediğim gibi böyle bir mekanizmanın başka yerlerde de işleri kestirmeden halletmek maksadı ile kullanılabileceğini düşünüyorum.

Bir programlama dili ile ilgili tartışmada, insanların kendi favori dillerinden feyz alıp o dilde olan ve tartışılan dilde de olsa diğer dildeki benzer faydaları getirebilecek olan bir özellikten bahsetmeleri olsa olsa söz konusu özelliğin popülaritesini ve insanların takdirini kazandığını gösterir. Eh, ateş olmayan yerden duman çıkmayacağına göre...

0
kamilbas
Bir programlama dili ile ilgili tartışmada, insanların kendi favori dillerinden feyz alıp o dilde olan ve tartışılan dilde de olsa diğer dildeki benzer faydaları getirebilecek olan bir özellikten bahsetmeleri olsa olsa söz konusu özelliğin popülaritesini ve insanların takdirini kazandığını gösterir. Eh, ateş olmayan yerden duman çıkmayacağına göre...

Bence sadece kendi favori dillerini överek ego mastürbasyonu yaptıklarını gösterir.
0
FZ
... ego mastürbasyonu yaptıklarını gösterir.

Birtakım teknik gerekçeler öne sürüldü yukarıdaki paragraflarda, gerekçelerin kendisini eleştirebilirsiniz ve bundan başkaları da bir şey öğrenebilir.

Ancak, bir teknik konu altında başka teknik konulara göndermede bulunulduğunda bu tür tepkiler verip "saçmalık, mastürbasyon, ego tatmini" gibi bir tavır takınır iseniz o zaman konuyu teknik bir tartışmadan çıkarıp kişisel saldırı noktasına çekersiniz ki bu pek de verimli bir iş olmaz. Derdiniz kişisel saldırı ise o zaman daha fazla bir söz etmenin anlamı yok. Fikirleri tartışmak genellikle daha faydalı bir eylem.
Görüş belirtmek için giriş yapın...

İlgili Yazılar

IronPython 1.0 Yayınlandı

zekzekus

5 Eylül 2006 tarihinde Python programlama dilinin Microsoft .NET Platformu üzerinde çalışan sürümünün 1.0 versiyonunun hazır olduğu açıklandı ve kaynak kodları ya da runtime kütüphaneleri olarak indirilmeye hazır. Buradan projenin ana sayfasına ulaşabilirsiniz.

IronPython: .Net üzerinde Python - Bölüm - 1

zekzekus

Bu metin Jeff Cogswell'in bu adreste bulunan makalesinin çevirisidir.

IronPython'a ilk bakış: .Net ile Python'un buluştuğu yer.

Bir itirafta bulunuyorum. C++ hakkında bir sürü kitap ve makale yazmış olmama rağmen bir sırrım var: C++ benim en sevdiğim programlama dili değil. Değişik amaçlar için kullandığım bir sürü programlama dili var. Ama her zaman en sevdiğim dil Python olmuştur.

Python, Google'ın da desteği ile ilerlemeye devam ediyor

FZ

Google'ın Python programlama diline olan ilgisi dikkat çekmeye devam ediyor. Eğer SOA (Service Oriented Architecture) tarzı uygulamalar için hızlı prototip geliştirmek istiyorsanız istediğiniz işlevselliği büyük ihtimalle Python 3.0'da bulacaksınız.

Django ORM ve SQLAlchemy üstünde Elixir karşılaştırması

muhuk

Django'yu işimde, Elixir'i (bu yazıdaki her Elixir'i Elixir+SQLAlchemy olarak okuyunuz) kendi projemde kullanıyorum. Dört veya beş yıl önce SQLObject ile başlayıp Unicode sorunları nedeniyle bende büyük hayal kırıklığı yaratan ORM macerama bir ay kadar önce FZ'nin önerisi üzerine bir şans daha verdim. Özellikle benim gibi aşırı titiz biri için SQL programlama belli bir karmaşıklıktan sonra işkence olabiliyor. ORM'ler de zamanla gelişmiş ve çok daha stabil hale gelmiş. Karşılaştırmasını yapacağım iki bileşen de yaygın kullanılan iyi projeler. Burada yazacaklarım tamamen benim fikirlerim, eğer hatalarım olursa veya farklı düşünceleriniz varsa lütfen yorum olarak paylaşınız.

Django Girls etkinliklerinden öğrendiklerimiz

elifkus

Kodlama saati yazısını görünce ben de Django Girls’ü ve İstanbul’daki etkinliklerimizden ve öğrendiklerimizden bahsedeyim dedim.

Amerika’da ve Dünya’da yazılımcıların kadın oranını arttırmak için birçok organizasyon ve etkinlik var. Django Girls, bunlardan biri. Ola Sitarska and Ola Sendecka adında iki Polonyalı kadın yazılımcı tarafından başlatılmış, 1 veya 2 günlük bir programlama etkinliği....