Python 2.7 rozdíl mezi global a local variable

The Simpson

Python 2.7 rozdíl mezi global a local variable
« kdy: 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 ?
« Poslední změna: 10. 11. 2017, 10:16:37 od Petr Krčmář »


ByCzech

  • *****
  • 1 870
    • Zobrazit profil
    • E-mail
Re:Python 2.7 rozdiel medzi global a local variable
« Odpověď #1 kdy: 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>

pb

Re:Python 2.7 rozdiel medzi global a local variable
« Odpověď #2 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í.

Kit

Re:Python 2.7 rozdiel medzi global a local variable
« Odpověď #3 kdy: 09. 11. 2017, 16:39:41 »
Globální proměnné se dnes už (nejen) v Pythonu nepoužívají. Je to peklo.

gll

Re:Python 2.7 rozdiel medzi global a local variable
« Odpověď #4 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:

Kód: [Vybrat]
import inspect

def check():
    frame = inspect.currentframe()
    frame.f_back.f_globals['test_check'] =  "Nova sprava"


Ondrej

Re:Python 2.7 rozdiel medzi global a local variable
« Odpověď #5 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.

dustin

Re:Python 2.7 rozdiel medzi global a local variable
« Odpověď #6 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í.

Inkvizitor

Re:Python 2.7 rozdiel medzi global a local variable
« Odpověď #7 kdy: 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?

gll

Re:Python 2.7 rozdiel medzi global a local variable
« Odpověď #8 kdy: 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.

The Simpson

Re:Python 2.7 rozdiel medzi global a local variable
« Odpověď #9 kdy: 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 ?

The Simpson

Re:Python 2.7 rozdiel medzi global a local variable
« Odpověď #10 kdy: 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.

Kit

Re:Python 2.7 rozdiel medzi global a local variable
« Odpověď #11 kdy: 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ů.

gll

Re:Python 2.7 rozdiel medzi global a local variable
« Odpověď #12 kdy: 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()

Kit

Re:Python 2.7 rozdiel medzi global a local variable
« Odpověď #13 kdy: 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.

gll

Re:Python 2.7 rozdiel medzi global a local variable
« Odpověď #14 kdy: 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.