Global name is not defined a este jedna otazocka – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Global name is not defined a este jedna otazocka – Python – Fórum – Programujte.comGlobal name is not defined a este jedna otazocka – Python – Fórum – Programujte.com

 

pato830
Newbie
13. 6. 2008   #1
-
0
-

Zdravím všetkých, konečne som sa dostal po dlhšom čase k pythonu. Som si vymyslel kalkulačku na zámenu mien jednotlivých štátov. Hned od začiatku sa držim predošlých rád od Geona, ohľadne používania funkcií. Skratka aby kod nebol v jednom súbore, ale hlavný program len volal jednotlivé funkcie importnutých modulov. Takže mám hlavný program, v ňom importované moduly a volajú sa jednotlivé funkcie. Program by mal fungovať nejak takto:
1. Stiahnutie kurzového lístka zo stránok www.nbs.sk vo formáte xml. XML som zvolil z dôvodu, že je to tam pekne otagované a už dávnejšie mi bolo vysvetlené, že je to skrátka veľká výhoda oproti txt či iným formátom.
2. Zmena kódovania z cp1250 na utf-8. Nie som si istý, či to je nutné, ale som si niečo o tom prečital a vychádza mi z toho, že je to najlepšia varianta používaného kódovania a mne sa to pod linuxom pekne zobrazuje, nemusím nič nastavovať. U priateľky na stroji ale už nie, použiva win, tak možno preto.
3. Tu by sa malo vytiahnuť jednotlivé štáty, ktoré sú v ponuke. Prichádza euro a mien bude menej a napevno zadávať štáty nie je vobec ideálne.
4. Vstup užívateľa, zadá si akú menu chce zameniť a v akej výške
5. Výstup

Kod by mohol vyzerať takto: /samozrejme, tak nebude, ale len ako príklad/

def useraction():

global vstup
vstup=raw_input("Zadaj menu alebo nazov krajiny: ")
if vstup==štát_z_ponuky:
mnozstvo=raw_input("Kolko chces zamenit")
vysledok=(int(kurz))*(int(mnozstvo))
print "Po zamene dostanete: ", vysledok
else:
print "V ponuke sa nenachadza dany stat. "

Všetky funkcie vykoná, teda stiahne súbor, zmení kódovanie, vytiahnutie dát ešte nie je. Ale pri tomto mi vypíše hlášku:
NameError: Global name "vstup is not defined"
Tak som pridal pred vypýtaním si hodnoty pre vstup riadok:
global vstup
Teda aspoň tak som to čítal na nejakej stránke. No nijako to moj problém nevyriešilo. Viem, prečo treba nejakým spôsobom definovať, ktoré premenné zachovať a ktoré možu s vykonaním funkcie zaniknúť, ale toto neviem žial.

A ešte taká malá otázočka. Rozmýšlal som, ako vytiahnuť dáta z toho súboru tak, aby si zachovali zavislosti a zaroveň boli použiteľné v programe. Najskôr budem musieť nájsť modul, ktorý pracuje s xml alebo si nieco také spraviť. Keby sa toto podarilo, tak by som skúsil nejak automaticky generovať polia pre každý jednotlivý štát. Obsahom pola by bol znak meny a aktuálny kurz. Nejaký modul s prácou s xml alebo použiteľný modul na toto? Celkom zaujímavo vyzerá použitie slovníkov, ale to sa ešte uvidi, či to bude možne.

Takže by som bol rád, keby mi niekto poradil s problémom a prípadne nejakú pripomienku k tej malej otázočke :D Ďakujem za čas :)

Nahlásit jako SPAM
IP: 217.145.199.–
Quiark0
Věrný člen
13. 6. 2008   #2
-
0
-

Na XML je v Pythonu standardní knihovna, stačí se podívat do dokumentace.

To s tou globální proměnnou jsi asi špatně pochopil. Pokud vytvoříš proměnnou ve funkci, tak ta vždy zanikne. Aby ti data zůstala, musíš vytvořit proměnnou mimo funkci a až v té funkci do ní přiřadit hodnotu. Asi takhle:



data = []

def nacti_data():
global data # timto rekneme, ze chceme pracovat s globalni promennou data, kterou jsme uz vytvorili
data = [ 1, 2, 3 ]

nacti_data()

Nahlásit jako SPAM
IP: 194.212.43.–
pato830
Newbie
13. 6. 2008   #3
-
0
-

To Quiark : Ďakujem za rýchlu odpoveď. Idem sa pozrieť na tu dokumentáciu. Ďakujem samozrejme aj za vyvedenie z omylu ohladne globálnych premenných. Už mi je to jasné. :)

Nahlásit jako SPAM
IP: 217.145.199.–
pato830
Newbie
17. 6. 2008   #4
-
0
-

To Quiark : Takže, neviem, ako je to možné, ale nefunguje to :). Alebo lepšie povedané, takúto banalitu nedokažem spojazdniť. Ked to napíšem do jedného scriptu, presne to, čo si písal, tak to funguje samozrejme. A rozumiem, aj tomu, čo si mi vysvetloval, ale.... Ak napíšem niečo taketo:



def nacti_data():
global data
data=[1,2,3]
A potom tento modul importnem a budem ho volať:


from nacti_data import *

data=[]
nacti_data()
print data
Časť print data mi vrati prazdne pole. Najprv sa predsa načíta pre data prázdne pole a až potom sa mu pridajú, po zavolaní funkcie nacti_data, hodnoty odtial.

p.s.: Najskôr robím chybu ja niekde, alebo som úplne mimo, ale pre istotu ma v tom utvrďte. :D

Nahlásit jako SPAM
IP: 217.12.51.–
Quiark0
Věrný člen
17. 6. 2008   #5
-
0
-

Teď už to ale hrozně prasíš. Možná by mělo být to data = [] před importem.

Ale spíš bych se globálním proměnným vyhnul a prostě ta načtená data vracel jako návratovou hodnotu z funkce.



def nacti_data():
return [1,2,3]


data = nacti_data()

Nahlásit jako SPAM
IP: 194.212.43.–
pato830
Newbie
17. 6. 2008   #6
-
0
-

To Quiark : Vdaka :) Pomocou return to ide v pohode. Cez globalnu premennú mi to nijako nejde, nech to dám kdekoľvek.

p.s: By ma zaujímalo, prečo to hrozne prasím? :) Postup je zlý alebo kde je chyba?

Nahlásit jako SPAM
IP: 217.12.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 6 hostů

Podobná vlákna

Class a global — založil Martin Halaj

Global - problém — založil Vasek

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý