2011-05-15 29 views
7

2 dosya main.py ve irc.py var.
main.pyPython: Modüldeki ana dosyadaki değişkeni nasıl kullanabilirim?

import irc 
var = 1 
func() 

irc.py

def func(): 
    print var 

Ben bu hatayı çalışması için nasıl

NameError: global name 'var' is not defined

alıyorum main.py çalıştırmayı deneyin?

@Edit
Ben daha iyi bir çözüm ama orada düşünce ne yazık buldum tek
main.py başka bir dosya yapmak ve her iki dosyalara içe olmaktır

import irc 
import another 
another.var = 1 
irc.func() 

irc.py

import another 
def func(): 
    print another.var 

another.py

var = 0 

cevap

10

Yapmayın. İçeri girin. Kodunuzu mümkün olduğunca ayrıştırılmış olarak tutun ve tutun: Bir modül diğerinin iç çalışmalarına güvenmemelidir. Bunun yerine mümkün olduğunca az deneyin ve gösterin. Bu şekilde, her şeyi yapmak istediğinizde dünyayı değiştirmek zorunda kalmadan kendinizi koruyacaksınız.

main.py

import irc 
var = 1 
func(var) 

irc.py

def func(var): 
    print var 
+0

yerine beni bu argümanı – gr56

+0

gr56 @ ekleyerek ana dosyaya bu işlevi taşımak için daha kolay olacaktır: üstlenmeden sırayla gibi Sonra geliyor. Eğer bu mümkün değilse, sadece 'var' nesnesini içeren ve her ikisiyle de içe aktarılan üçüncü bir modülün çözümüyle giderdim. Bu sizin için çalışıyorsa, lütfen kendi sorunuza yanıt olarak gönderin ve kabul edin. –

+0

@SamirTalwar Bunu fonksiyonlar için yapabilirsin, derslerin somutlaştırılması için ne dersin? Örneğin, bir sınıfın örneklerini içe aktabileceğiniz başka bir modülde tanımlamak istersiniz. Argümanlar bu durumda yer tutucu olamaz. –

0

Eh, işlevinde var bildirilmedi. Bir argüman olarak geçebilirsin. main.py

import irc 
var = 1 
func(var) 

irc.py

def func(str): 
    print str 
1

iki seçenektir.

from main import var 

def func(): 
    print var 

Bu

ithal modülüne orijinal adıyla bir başvuru kopyalar.

import main 

def func(): 
    print main.var 

Bu, diğer modülünden değişkeni kullanmasını sağlayabilir ve istenirse bunu değiştirmek için izin verecektir.

func.py:

import __main__ 
def func(): 
    print(__main__.var) 

ana

+0

Oh, bu sadece yanlış. Karşılıklı ithalatlar bana heebie jeebies veriyor. –

+0

O zaman ne yaptığını bilmiyorsun. Karşılıklı ithalatlar tamamen güvenli ve çok net bazı kısıtlamalar verildiğinde iyi çalışıyorlar. –

+0

@Ignacio: Ve sorunu vurgulamak için tasarlanan bu oyuncak kodunda iyi çalışırlar. Şüphelerim var gerçek hayatta beklendiği gibi çalışacaklar. Yapsalar bile, sadece yeni özellikler eklemeye ve eskisinden çok daha zor olanları sürdürmeye hizmet eden modüller arasında bulanık çizgiler teşvik edeceklerdir. Karşılıklı ithalatların, orijinal ikisine hizmet eden üçüncü bir modülden daha iyi çalıştığı bir durum düşünemiyorum. –

5

Eh, bu iyi çalışır benim kod.py:

from func import func 

var="It works!" 
func() 
var="Now it changes!" 
func() 
+0

Bu çözümü beğendim ve işe yarıyor ... ama tutulma bana" Tanımsız "veriyor içe aktarma değişkeni: herhangi bir içe aktarılan değişkende var hatası veya ana işlev. Bunu aşmanın bir yolu var mı? – user4061565

+0

bkz. [Nasıl yapılır-it-fix-pydev-undefined-import-from-import-errors] (https://stackoverflow.com/questions/2112715/how-do-i-fix-pydev-undefined-variable- dan-ithalat-hatalar) – user4061565

İlgili konular