Zanurkuj w Pythonie/locals i globals: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Piotr (dyskusja | edycje)
Piotr (dyskusja | edycje)
koniec tłumaczenia
Linia 1:
{{Podświetl|py}}
{{WEdycji}}
 
== <tt>locals</tt> i <tt>globals</tt> ==
Linia 51 ⟶ 50:
'''Przykład 8.11. Wprowadzenie do <tt>globals</tt>'''
 
LookSpójrz atna theponiższy followingblok blockkodu, ofktóry codeznajduje atsię thena bottom ofdole <tt>BaseHTMLProcessor.py</tt>:
 
if __name__ == "__main__":
Linia 57 ⟶ 56:
print k, "=", v
 
# Właściwie nie czujesz wystraszony, pamiętasz, że widzieliśmy to już wcześniej. Funkcja <tt>globals</tt> zwraca słownik, który następnie iterujemy wykorzystując metodę <tt>items</tt> i wielozmienne przypisanie. Jedyną nową rzeczą jest funkcje <tt>globals</tt>.
# Just so you don't get intimidated, remember that you've seen all this before. The globals function returns a dictionary, and you're iterating through the dictionary using the items method and multi-variable assignment. The only thing new here is the globals function.
 
Teraz, uruchamiając skrypt z linii poleceń otrzymamy takie wyjście (twoje wyjście może się nieco różnić, zależnie od tego, na jakim systemie i gdzie zainstalowałeś Pythona):
Now running the script from the command line gives this output (note that your output may be slightly different, depending on your platform and where you installed Python):
 
c:\docbook\dip\py> python BaseHTMLProcessor.py
 
SGMLParser = sgmllib.SGMLParser #(1)
htmlentitydefs = <module 'htmlentitydefs' from 'C:\Python23\lib\htmlentitydefs.py'> #(2)
BaseHTMLProcessor = __main__.BaseHTMLProcessor #(3)
__name__ = __main__ #(4)
... pozostała część pominięta dla czytelności ...
... rest of output omitted for brevity...
 
# <tt>SGMLParser</tt> waszostał importedzaimportowany fromz <tt>sgmllib</tt>, usingwykorzystując <tt>from module import</tt>. ThatOznacza meansto, thatże itzostał waszaimportowany importedbezpośrednio directlydo intoprzestrzeni thenazw module'smodułu namespace,i w andtym hereteż itmiejscu isjest.
# ContrastW thisprzeciwieństwie withdo htmlentitydefs<tt>SGMLParser</tt>-a, which<tt>htmlentitydefs</tt> waszostał importedzaimportowany usingwykorzystując instrukcję <tt>import</tt>. ThatOznacza meansto, thatże themoduł <tt>htmlentitydefs</tt> modulesam itselfw issobie injest theprzestrzenią namespacenazw, butale thezmienna <tt>entitydefs</tt> variable defined withinwewnątrz <tt>htmlentitydefs</tt> isjuż notnie.
# ThisModuł moduleten onlydefiniuje definesjedną one classklasę, <tt>BaseHTMLProcessor,</tt> andi heretutaj iton isjest. NoteDodajmy, thatże theta valuewartość heresamą is the class itselfklasą, not a specificnie jakąś instancespecyficzną ofinstancją thetej classklasy.
# RememberPamiętasz thetrik <tt>if __name__ trick</tt>? When runningKiedy auruchamiamy modulemoduł (aszamiast opposedimportować to importing itgo fromz anotherinnego modulemodułu), theto wbudowany built-inatrybut <tt>__name__</tt> attributema isspecjalną a special valuewartość, <tt>"__main__"</tt>. SincePonieważ youuruchomiliśmy ranten thismoduł modulejako asskrypt az scriptlinii frompoleceń, the command line,wartość <tt>__name__</tt> iswynosi <tt>"__main__"</tt>, whichdlatego isteż whyzostanie thewykonany littlemały testkod codetestowy, toktóry print thewypisuje <tt>globals got executed</tt>.
 
{{Infobox|
Note
Korzystają z funkcji <tt>locals</tt> i <tt>globals</tt> możemy pobrać dynamicznie wartość dowolnej zmiennej, dzięki przekazaniu nazwy zmiennej w postaci napisu. Funkcjonalność ta jest analogiczna do <tt>getattr</tt>, która pozwala dostać się do dowolnej funkcji, dzięki przekazaniu jej nazwy w postaci napisu.
Using the locals and globals functions, you can get the value of arbitrary variables dynamically, providing the variable name as a string. This mirrors the functionality of the getattr function, which allows you to access arbitrary functions dynamically by providing the function name as a string.
}}
 
Tutaj mamy inną ważną różnicę między funkcjami <tt>locals</tt> i <tt>globals</tt>, a o których powinieneś się dowiedzieć, zanim cię ukąsi. Jakkolwiek to i tak cię ukąsi, ale przynajmniej będziesz pamiętał, że się o tym uczyłeś.
There is one other important difference between the locals and globals functions, which you should learn now before it bites you. It will bite you anyway, but at least then you'll remember learning it.
 
Example 8.12. locals is read-only, globals is not
'''Przykład 8.12. <tt>locals</tt> jest tylko do odczytu, a <tt>globals</tt> już nie'''
 
 
Linia 93 ⟶ 94:
print "z=",z #(5)
 
# SincePonieważ <tt>foo</tt> iszostało calledwywołane withz <tt>3</tt>, thiswięc willzostanie printwypisane <tt>{'arg': 3, 'x': 1}</tt>. ThisNie shouldpowinno notto bebyć a surprisezaskoczeniem.
# <tt>locals</tt> jest funkcją zwracającą słownik i w tym miejscu zmieniamy wartość w tym słowniku. Możesz myśleć, że wartość zmiennej <tt>x</tt> zostanie zmieniona na <tt>2</tt>, jednak tak nie jest. <tt>locals</tt> właściwie nie zwraca lokalnej przestrzeni nazw, zwraca jego kopię. Zatem zmieniając ją, nie zmieniamy wartości zmiennych w lokalnej przestrzeni nazw.
# locals is a function that returns a dictionary, and here you are setting a value in that dictionary. You might think that this would change the value of the local variable x to 2, but it doesn't. locals does not actually return the local namespace, it returns a copy. So changing it does nothing to the value of the variables in the local namespace.
# ThisZostanie printswypisane <tt>x= 1</tt>, nota nie <tt>x= 2</tt>.
# AfterPo beingtym, burnedjak byzostaliśmy poparzeni przez <tt>locals</tt>, możemy myśleć, że ta operacja nie zmieni wartości <tt>z</tt>, ale w rzeczywistości zmieni. you might think that this wouldn't change the value of z, but it does. DueW toskutek internalwewnętrznych differencesróżnicach inimplementacyjnych how<ref>Nie Pythonbędziemy issię implementedwdawać (whichw I'dszczegóły</ref>, rather<tt>globals</tt> notzwraca go intoaktualną, since I don't fullyglobalną understandprzestrzeń them myself)nazw, globalsa returnsnie thejej actualkopię; globalcałkowicie namespace,odwrotne notzachowanie aw copy:stosunku the exact opposite behavior ofdo <tt>locals</tt>. SoTak anywięc changesdowolna tozmiana, thezwróconego dictionary returned byprzez <tt>globals</tt> słownika, directlybezpośrednio affectwpływa yourna globalzmienne variablesglobalne.
# This printsWypisze <tt>z= 8</tt>, nota nie <tt>z= 7</tt>.
 
'''Przypisy'''
----
<references />
 
 
<noinclude>