2012-06-28 15 views
5

kısa olmak gerekirse, benBir python yönteminin kaynak kodu nasıl kontrol edilir?

next = "123rpq" 

bir dize 'next', olduğunu varsayalım ve ben 'next' bir str yöntemi .isdigit() uygulayabilirsiniz. Yani benim sorum bu yöntemin uygulanmasını kontrol etmektir. Bu nedenle 'method' kaynak kodunu almak için inspect.getsource(somefunction) gibi bir şey var mı?

GÜNCELLEME: değişken adı 'next' ile ilgili yoruma bakın.

+2

Lütfen 'next' değişkenini çağırmayın çünkü 'next' öğesini gölgeler. – Matthias

+0

@Matthias, teşekkürler. –

cevap

7

Modüller, sınıflar, işlevler ve diğer birkaç nesne için inspect.getfile veya inspect.getsourcefile'u kullanabilirsiniz. Ancak, yerleşik nesneler ve yöntemler için bu, TypeError ile sonuçlanacaktır. C0deH4cker tarafından ölçüldüğü gibi, yerleşik nesneler ve yöntemler C'de uygulanır, bu yüzden C kaynak koduna göz atmanız gerekir. isdigit, Python kaynak kodunun Objects dizinindeki stringobject.c dosyasında uygulanan yerleşik dize nesnesinin bir yöntemidir. Bu isdigits yöntemi, bu dosyanın 3392 satırından uygulanır. Ayrıca benzer ama daha genel bir soruyu yanıtlamak için here cevabına bakın.

0

Bu yöntemle ilgili belgeler için method.__doc__ yazmayı deneyebilirsiniz. Sadece merak ediyorsanız, modüllerinizin nereden geldiğini görmek için PYTHONPATH'nizi kontrol edebilir ve bu modülden .py dosyasını bulup bulamayacağınızı görebilirsiniz.

+1

'help (str.isdigit)' –

+0

@Pablo’yu kullanmak daha iyidir. Soruyu kullanarak davayı kullanarak bana örnek verebilir misiniz; next.isdigit() 'için kaynak kodu nasıl yazdırılır? @AshwiniChaudhary tarafından yazılan –

+0

, yardım (str.isdigit) veya str.isdigit .__ doc__ yazabilirsiniz. –

6

Söz konusu olan bir isdigit() yöntemi, yerleşik bir yerleşik yöntemdir. veri tipi. Anlamı, bu yöntemin kaynağı Python değil, C dilinde yazılmıştır. Kaynak kodunu gerçekten görmek isterseniz, http://python.org'a gitmenizi ve Python'un kaynak kodunu indirmenizi öneririm.

0

Genel olarak inspect'un iyi bir yanıt olduğunu kabul etmekteyken, sınıfınız (ve dolayısıyla sınıf yöntemi) yorumlayıcıda tanımlandığında düz düşer.

dill'dan dill.source.getsource kullanırsanız, etkileşimli olarak tanımlanmış olsa bile, işlevlerin ve lambda kaynağının kaynağını alabilirsiniz. Ayrıca, körüklerde tanımlanan ciltli veya bağlı olmayan sınıf yöntemleri ve işlevleri için kod da alabilirsiniz ... ancak, bu kodu, örtülü nesnenin kodu olmadan derleyemeyebilirsiniz. Hala önerildiği üzere kendisine (kaynak kodu ile dosyayı açmak için favori editörü kullanarak başvurmak zorunda olmayabilir

builtin işlevler veya yöntemleri için

>>> from dill.source import getsource 
>>> 
>>> def add(x,y): 
... return x+y 
... 
>>> squared = lambda x:x**2 
>>> 
>>> print getsource(add) 
def add(x,y): 
    return x+y 

>>> print getsource(squared) 
squared = lambda x:x**2 

>>> 
>>> class Foo(object): 
... def bar(self, x): 
...  return x*x+x 
... 
>>> f = Foo() 
>>> 
>>> print getsource(f.bar) 
def bar(self, x): 
    return x*x+x 

>>> 

, dill.source ... ANCAK ... çalışmayacak diğer cevaplar). builtins için kaynağı görüntüleyebildiğini iddia eden cinspect adlı yeni bir paket var.

İlgili konular