Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: The Simpson 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 ?
-
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í.
-
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?
-
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.
-
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ů.
-
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()
-
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.
-
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)
-
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.
-
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
-
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"
-
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 :(
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
-
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.
-
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.