2009-11-13 3 views
9

İçinde bir fonksiyona sahip bir Python modülüm var:Bir fonksiyonun Python'dan nereden alındığı nasıl bulunur?

 == bar.py == 
    def foo(): pass 
    == EOF == 

Ve sonra onu global ad alanına şu şekilde aktarıyorum:

from bar import * 

Artık foo işlevi bana açık. Eğer yazdıysam:

yorumlayıcı bana mutlu bir şekilde söyler:

 <function foo at 0xb7eef10c> 

Bu noktada foo modülünün bar modülünden geldiğini öğrenmenin bir yolu var mı?

+0

Neden çubuktan içe aktarma '' kullanıyorsunuz? Neden böyle? Bu spesifik sözdizimi, sorununuza neden olan şeydir, o zaman neden? –

cevap

18

foo.__module__ Daha fazla bilgi gerekiyorsa varsa, sys.modules['bar'] mal alabilirsiniz bar

dönmelidir, onun __file__ ve __package__ nitelikleri ilginç olabilir.

+0

Bu __package__ özniteliği gerçekten harika, ancak kullanılamıyor gibi görünüyor. Python 2.5.2'de kullanılabilir mi? –

+1

Ah no, Python 2.6'da yeni görünüyor: http://www.python.org/doc/2.6/whatsnew/2.6.html#pep-366-explicit-relative-imports-from-a-main-module – Wim

+0

Ok Bu yüzden __package__ şeyi biraz araştırdım. Anlayamadığım şey, değerin varsayılan olarak eklenip eklenmeyeceği veya bir şey belirtmem gerekirse. Boş bir modül ("z.xx") almayı denedim ve z.xx .__ package__ Hiçbiri döndürmedi. Yanlış bir şey mi yapıyorum? –

1

yerine

from bar import * 

kullanımını from ... import * sözdizimi kullanarak

from bar import foo 

kesin kötü bir programlama tarzıdır buna sert nerede elemanlarını bilmek yapar çünkü ad alanınızdan geliyor.

+0

+1 Bu geçerli bir noktadır, ancak problemi çözmese de (eğer soru programın programın neresinden geldiğini bilmek istiyorsa, 'import import foo' ifadesi temelde aynıdır) – dbr