Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: The Simpson 09. 11. 2017, 15:30:54

Název: Python 2.7 rozdíl mezi global a local variable
Přispěvatel: The Simpson 09. 11. 2017, 15:30:54
Dobry den.
Potreboval by som nieco vysvetlit. V pythone spravim nieco taketo
Kód: [Vybrat]
import database

#import for library
from database import *
test_msg = "Stara sprava"

def test_database():
  print (test_check)

print test_database

v database.py je nieco taketo
Kód: [Vybrat]
def check():
 
  global test_check
  test_check = "Nova sprava"

ale vracia mi to len Stara sprava. Nie je mi celkom jasne ako funguje zavislost na globalnych premennach ak chcem pouzit napriklad hodnotu test_check ktoru som pre danu funkciu nastavil ako globalnu. Tato funkcia by mala "prepisovat" vsetky ostatne hodnoty test_check ktore su v programe pouzite dalej. alebo nie? Aky je spravny postup ak chcem zadefinovat premenne ako globalne a pouzivat ich na viacerych miestach ?
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: ByCzech 09. 11. 2017, 15:59:39
V pythone spravim nieco taketo
v database.py je nieco taketo

Buď dáte přesně co tam je, jinak se těžko dočkáte pomoci. Na "něco takového" asi těžko poradíme, protože to co jste poslal je úplný nesmysl a vrací "něco takového":

Kód: [Vybrat]
<function test_database at 0x7f6863ae2668>
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: pb 09. 11. 2017, 16:00:56
Správný postup je globální proměnné nevyužívat vůbec nijak.

K tomu, co asi chcete udělat, jestli vůbec můžu odhadnout, co chcete udělat se rozhodně globální proměnné nepoužívají.
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: Kit 09. 11. 2017, 16:39:41
Globální proměnné se dnes už (nejen) v Pythonu nepoužívají. Je to peklo.
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: gll 09. 11. 2017, 16:59:49
ten váš kód (po opravě)  pouze vytvoří proměnnou v modulu database.

globální proměnné ve spojení s dynamickým scopováním jsou neskutečně užitečná věc. Bohužel Python v tomto ohledu hází klacky pod nohy. Musíte použít funkce z inspect. Třeba takto:

Kód: [Vybrat]
import inspect

def check():
    frame = inspect.currentframe()
    frame.f_back.f_globals['test_check'] =  "Nova sprava"
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: Ondrej 09. 11. 2017, 17:34:22
globální věci v pzthonu jsou prasárna, pak aby se v tom po tobě někdo vyznal a nezačínej s py 2.7, ale rovnu s trojkou.
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: dustin 09. 11. 2017, 17:43:11
A rovnou důsledně používat type hinty. I v té 2.7, pokud projekt novou verzi ještě neumí.
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: Inkvizitor 09. 11. 2017, 18:17:17
globální proměnné ve spojení s dynamickým scopováním jsou neskutečně užitečná věc. Bohužel Python v tomto ohledu hází klacky pod nohy. Musíte použít funkce z inspect. Třeba takto:
...

Muzes prosim napsat, k cemu to je tak moc uzitecne?
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: gll 09. 11. 2017, 19:01:17
globální proměnné ve spojení s dynamickým scopováním jsou neskutečně užitečná věc. Bohužel Python v tomto ohledu hází klacky pod nohy. Musíte použít funkce z inspect. Třeba takto:
...

Muzes prosim napsat, k cemu to je tak moc uzitecne?

to je snad jasné. Některé hodnoty chcete mít přístupné globálně v celém programu.
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: The Simpson 09. 11. 2017, 19:17:03
Priklad
start.py
Kód: [Vybrat]
import database
from database import *

data_read()
print (new_text)

v database.py mam len toto
Kód: [Vybrat]
def data_read():
    new_text = "Text Change"

a vyhadzuje to chybu
Kód: [Vybrat]
Traceback (most recent call last):
  File "C:/Users/op/Desktop/A/init.py", line 5, in <module>
    print (new_text)
NameError: name 'new_text' is not defined

Ide o to ze dalej tu funkciu data_read budem volat napriklad len ked budem chciet "refreshnut" data ale obcas potrebujem niektore tie data s tej funkcie aj zobrazit niekde inde v programe.
Ako to teda spravit bez pouzitia global ? A ak pouzit global kde je najlepsie ho definovat ak viem ze tie data na 100% zapisujem len v tej funkcii a inde v programe sa len citaju ?
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: The Simpson 09. 11. 2017, 19:19:09
Mala chyba resp. velka. Spravne to ma byt
Kód: [Vybrat]
import database
from database import *
new_text = "start"
data_read()
print (new_text)

a vracia mi to len hodnotu "start". Zvysok ako chcem pouzit tu funkciu ostava rovnaky.
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: Kit 09. 11. 2017, 19:19:56
globální proměnné ve spojení s dynamickým scopováním jsou neskutečně užitečná věc. Bohužel Python v tomto ohledu hází klacky pod nohy. Musíte použít funkce z inspect. Třeba takto:
...

Muzes prosim napsat, k cemu to je tak moc uzitecne?

to je snad jasné. Některé hodnoty chcete mít přístupné globálně v celém programu.

Které? Nemám žádné hodnoty, které bych chtěl mít přístupné globálně. I konstanty vždy patří do nějaké třídy, jinak je to opruz. Tím se samozřejmě nezastávám statických atributů.
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: gll 09. 11. 2017, 19:25:24
Ide o to ze dalej tu funkciu data_read budem volat napriklad len ked budem chciet "refreshnut" data ale obcas potrebujem niektore tie data s tej funkcie aj zobrazit niekde inde v programe.
Ako to teda spravit bez pouzitia global ? A ak pouzit global kde je najlepsie ho definovat ak viem ze tie data na 100% zapisujem len v tej funkcii a inde v programe sa len citaju ?

v tomto konkrétním případě by možná stačilo ta data vrátit.

Kód: [Vybrat]
def data_read():
    return "Text Change"
Kód: [Vybrat]
print data_read()
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: Kit 09. 11. 2017, 19:39:13
Ide o to ze dalej tu funkciu data_read budem volat napriklad len ked budem chciet "refreshnut" data ale obcas potrebujem niektore tie data s tej funkcie aj zobrazit niekde inde v programe.
Ako to teda spravit bez pouzitia global ? A ak pouzit global kde je najlepsie ho definovat ak viem ze tie data na 100% zapisujem len v tej funkcii a inde v programe sa len citaju ?

Použij návrhový vzor Observer. Při modifikaci dat svým abonentům sám oznámí, že si je mají obnovit.
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: gll 09. 11. 2017, 19:48:25
Které? Nemám žádné hodnoty, které bych chtěl mít přístupné globálně. I konstanty vždy patří do nějaké třídy, jinak je to opruz. Tím se samozřejmě nezastávám statických atributů.

nechci začínat novou diskuzi na téma OOP, když předem vím, že se neshodneme.
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: pedro 09. 11. 2017, 20:02:54
Pouzivas to spatne.

Kód: [Vybrat]
import database
from database import *

Jedno nebo druhe, vzhledem k dalsimu zapisu to druhe...

Kód: [Vybrat]
def check():
    global test_check
    test_check = "Nova sprava"

Kód: [Vybrat]
print (test_check)

Vzdyt do tehle chvili neprobehlo zadne prirazeni do promenne test_check.

Zkus to takto
Kód: [Vybrat]
check()
print (test_check)
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: gll 09. 11. 2017, 20:35:15
Pouzivas to spatne.

Kód: [Vybrat]
import database
from database import *

Jedno nebo druhe, vzhledem k dalsimu zapisu to druhe...

Kód: [Vybrat]
def check():
    global test_check
    test_check = "Nova sprava"

Kód: [Vybrat]
print (test_check)

Vzdyt do tehle chvili neprobehlo zadne prirazeni do promenne test_check.

Zkus to takto
Kód: [Vybrat]
check()
print (test_check)

to nebude fungovat. nastavite promennou database.test_check az po importu. V hlavnim modulu nebude videt.
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: Inkvizitor 09. 11. 2017, 20:39:33
globální proměnné ve spojení s dynamickým scopováním jsou neskutečně užitečná věc. Bohužel Python v tomto ohledu hází klacky pod nohy. Musíte použít funkce z inspect. Třeba takto:
...

Muzes prosim napsat, k cemu to je tak moc uzitecne?

to je snad jasné. Některé hodnoty chcete mít přístupné globálně v celém programu.

Mne to teda jasne neni. Za prve je mozne to delat pres modul, tridni atribut nebo singleton a za druhe jsi v souvislosti s tim mluvil o dynamickem scopovani.
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: The Simpson 09. 11. 2017, 20:46:26
pedro tvoje riesenie mi vracia chybu
Kód: [Vybrat]
NameError: name 'test_check' is not defined
neviem ci to chapem spravne ale akoby sa ta premenna s testcheck "nenastavila" resp. nepreniesla vramci importu

gll: mohol by si priklad ?
Dakujem
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: gll 09. 11. 2017, 20:53:11
pedro tvoje riesenie mi vracia chybu
Kód: [Vybrat]
NameError: name 'test_check' is not defined
neviem ci to chapem spravne ale akoby sa ta premenna s testcheck "nenastavila" resp. nepreniesla vramci importu

gll: mohol by si priklad ?
Dakujem

Kód: [Vybrat]
import database

check()
print (database.test_check)

database.py
Kód: [Vybrat]
def check():
    global test_check
    test_check = "Nova sprava"
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: gll 09. 11. 2017, 21:05:19
Mne to teda jasne neni. Za prve je mozne to delat pres modul, tridni atribut nebo singleton a za druhe jsi v souvislosti s tim mluvil o dynamickem scopovani.

dynamické scopování umožňuje dočasné přepisování globálních proměnných

Kód: [Vybrat]
def f():
     PARAM = 'value'
     f2() # f2 vidí PARAM jako globální proměnnou s hodnotou 'value'
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: gll 09. 11. 2017, 21:15:29
dynamické scopování byla odpověď na na původní tazatelův problém. Chtěl nastavit globální proměnnou ve framu, ze kterého volal.
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: The Simpson 10. 11. 2017, 09:28:27
Ospravedlnujem sa ale nepochopil som to :(
pedro tvoje riesenie mi vracia chybu
Kód: [Vybrat]
NameError: name 'test_check' is not defined
neviem ci to chapem spravne ale akoby sa ta premenna s testcheck "nenastavila" resp. nepreniesla vramci importu

gll: mohol by si priklad ?
Dakujem

Kód: [Vybrat]
import database

check()
print (database.test_check)

database.py
Kód: [Vybrat]
def check():
    global test_check
    test_check = "Nova sprava"


Presne takto to funguje ! Genialne dakujem
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: Inkvizitor 10. 11. 2017, 09:49:41
dynamické scopování byla odpověď na na původní tazatelův problém. Chtěl nastavit globální proměnnou ve framu, ze kterého volal.

Moje otazka ale znela, co presne Ti Python znemoznuje delat a je to tak uzitecne, jinymi slovy jestli ty prostredky, ktere Python ma, nestaci na (trosku jinak implementovany) ukol, ktery chces resit. Ten puvodni dotaz reseni mel a podle me moc nebolelo.
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: gll 10. 11. 2017, 20:30:39
dynamické scopování byla odpověď na na původní tazatelův problém. Chtěl nastavit globální proměnnou ve framu, ze kterého volal.

Moje otazka ale znela, co presne Ti Python znemoznuje delat a je to tak uzitecne, jinymi slovy jestli ty prostredky, ktere Python ma, nestaci na (trosku jinak implementovany) ukol, ktery chces resit. Ten puvodni dotaz reseni mel a podle me moc nebolelo.

Nic mi neznemožňuje, ale některé věci komplikuje. Už jsem psal výše, nelze jednoduše předefinovat globální symbol. Musíte vědět, z kterého modulu byl importován. Výhody dynamického scopování se těžko ukazují na Pythonu, kde jde realizovat jen s použitím inspect.