Fórum Root.cz

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

Název: Python 2.7 rozdíl mezi global a local variable
Přispěvatel: The Simpson kdy 09. 11. 2017, 15:30:54
Dobry den.
Potreboval by som nieco vysvetlit. V pythone spravim nieco taketo
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
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 kdy 09. 11. 2017, 15:59:39
Citace od: The Simpson kdy 09. 11. 2017, 15:30:54
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":


<function test_database at 0x7f6863ae2668>
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: pb kdy 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 kdy 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 kdy 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:


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 kdy 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 kdy 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 kdy 09. 11. 2017, 18:17:17
Citace od: gll kdy 09. 11. 2017, 16:59:49
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 kdy 09. 11. 2017, 19:01:17
Citace od: Inkvizitor kdy 09. 11. 2017, 18:17:17
Citace od: gll kdy 09. 11. 2017, 16:59:49
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 kdy 09. 11. 2017, 19:17:03
Priklad
start.py

import database
from database import *

data_read()
print (new_text)


v database.py mam len toto

def data_read():
    new_text = "Text Change"


a vyhadzuje to chybu
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 kdy 09. 11. 2017, 19:19:09
Mala chyba resp. velka. Spravne to ma byt
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 kdy 09. 11. 2017, 19:19:56
Citace od: gll kdy 09. 11. 2017, 19:01:17
Citace od: Inkvizitor kdy 09. 11. 2017, 18:17:17
Citace od: gll kdy 09. 11. 2017, 16:59:49
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 kdy 09. 11. 2017, 19:25:24
Citace od: The Simpson kdy 09. 11. 2017, 19:17:03
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.


def data_read():
    return "Text Change"


print data_read()

Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: Kit kdy 09. 11. 2017, 19:39:13
Citace od: The Simpson kdy 09. 11. 2017, 19:17:03
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 kdy 09. 11. 2017, 19:48:25
Citace od: Kit kdy 09. 11. 2017, 19:19:56
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 kdy 09. 11. 2017, 20:02:54
Pouzivas to spatne.


import database
from database import *


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


def check():
    global test_check
    test_check = "Nova sprava"



print (test_check)


Vzdyt do tehle chvili neprobehlo zadne prirazeni do promenne test_check.

Zkus to takto

check()
print (test_check)
Název: Re:Python 2.7 rozdiel medzi global a local variable
Přispěvatel: gll kdy 09. 11. 2017, 20:35:15
Citace od: pedro kdy 09. 11. 2017, 20:02:54
Pouzivas to spatne.


import database
from database import *


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


def check():
    global test_check
    test_check = "Nova sprava"



print (test_check)


Vzdyt do tehle chvili neprobehlo zadne prirazeni do promenne test_check.

Zkus to takto

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 kdy 09. 11. 2017, 20:39:33
Citace od: gll kdy 09. 11. 2017, 19:01:17
Citace od: Inkvizitor kdy 09. 11. 2017, 18:17:17
Citace od: gll kdy 09. 11. 2017, 16:59:49
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 kdy 09. 11. 2017, 20:46:26
pedro tvoje riesenie mi vracia chybu
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 kdy 09. 11. 2017, 20:53:11
Citace od: The Simpson kdy 09. 11. 2017, 20:46:26
pedro tvoje riesenie mi vracia chybu
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


import database

check()
print (database.test_check)


database.py

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 kdy 09. 11. 2017, 21:05:19
Citace od: Inkvizitor kdy 09. 11. 2017, 20:39:33
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


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 kdy 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 kdy 10. 11. 2017, 09:28:27
Ospravedlnujem sa ale nepochopil som to :(
Citace od: gll kdy 09. 11. 2017, 20:53:11
Citace od: The Simpson kdy 09. 11. 2017, 20:46:26
pedro tvoje riesenie mi vracia chybu
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


import database

check()
print (database.test_check)


database.py

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 kdy 10. 11. 2017, 09:49:41
Citace od: gll kdy 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.

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 kdy 10. 11. 2017, 20:30:39
Citace od: Inkvizitor kdy 10. 11. 2017, 09:49:41
Citace od: gll kdy 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.

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.