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 ?
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>
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í.
Globální proměnné se dnes už (nejen) v Pythonu nepoužívají. Je to peklo.
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"
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.
A rovnou důsledně používat type hinty. I v té 2.7, pokud projekt novou verzi ještě neumí.
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?
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.
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 ?
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.
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ů.
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()
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.
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.
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)
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.
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.
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
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"
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'
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.
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
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.
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.