variabilní rozsah python

hlasů
2

Začal jsem se učit o pythonu a je v současné době čtení prostřednictvím scénář napsal někdo jiný. Všiml jsem si, že globální proměnné jsou roztroušeny po celé scénáře (a já se to nelíbí) .. Kromě toho, že jsem si všiml, že když mám kód takového

def some_function():
    foo.some_method()
    # some other code

if __name__ == '__main__' :
    foo = Some_Object()

    some_function()

i když neprojde v foo do some_function (), ale some_function je stále schopen manipulovat s foo (??!). Nemám úplně takhle, i když je poněkud podobný uzavření JavaScriptu (?). Chtěl bych vědět, zda je možné zastavit some_function () v přístupu k foo, pokud je foo není předán jako argument funkce? Nebo to je preferovaný způsob, jak v Pythonu ??! (Já používám Python 2.5 pod ubuntu Hardy v současnosti)

Položena 27/08/2009 v 03:41
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
4

Že scénář má opravdu vážné problémy s stylu a organizace - například, když ji někdo dováží budou muset nějak božskou skutečnost, že je třeba nastavit thescript.foona instanci Some_Objectpřed voláním some_function... yeurgh -!)

Je to nešťastné, že jste se museli učit Python ze špatně napsán scénář, ale nejsem si jistý, chápu vaši otázku. Variabilní rozsah v Python je místní (včetně argumenty), nonlocals (tj místní okolních funkcí, pro vnořené funkce), globals, vestavěných příkazů.

Je to, co chcete zastavit přístup k globals? some_function.func_globalsje pouze pro čtení, ale je možné vytvořit novou funkci s prázdnými globals:

import new
f=new.function(some_function.func_code, {})

Nyní volání f()bude poskytnuta výjimka NameError: global name 'foo' is not defined. Dalo by se nastavit to zpátky v modulu s názvem some_function, nebo dokonce dělat to systematicky přes dekoratér, například:

def noglobal(f):
    return new.function(f.func_code, {})
...
@noglobal
def some_function(): ...

to zaručí výjimka se stane, když some_functionse nazývá. Nejsem jasné, o jaký přínos očekáváte odvodit z toho, ačkoli. Možná si můžete objasnit ...?

Odpovězeno 27/08/2009 v 04:11
zdroj uživatelem

hlasů
2

Pokud je mi známo, jediný způsob, jak zastavit some_functionpřístup fooje odstranit fooproměnnou z some_function‚s rozsah, případně jako:

tmp = foo
del foo
some_function()
foo = tmp

Samozřejmě, bude to havárii (aktuální) kód, protože fooneexistuje v rozsahu some_functionještě.

V Pythonu proměnné jsou vyhledávány na místě, pak v rozsahu až po celém světě, a nakonec vestavby jsou vyhledávány.

Další možností by mohlo být:

with some_object as foo:
    some_function()

Ale pak, budete mít alespoň prohlásit some_object.__exit__, možná some_object.__enter__stejně. Konečným výsledkem je, že můžete ovládat, které fooje v rozsahu some_function.

Další vysvětlení k „s“ prohlášením zde .

Odpovězeno 27/08/2009 v 03:53
zdroj uživatelem

hlasů
1

V pythonu, něco takového foonení hodnota, je to jméno . Při pokusu o přístupu do systému, Python se snaží najít hodnoty s ním spojené (jako dereferencing ukazatel). To dělá toto tím, že nejprve hledají v místním rozsahu (funkce), pak pracoval svou cestu ven, dokud nedosáhne rozsah modulu (tj globální), a konečně vestavěných příkazů, dokud nenajde něco odpovídající název.

Že dělá něco takového díla:

def foo():
    bar()

def bar():
    pass

Navzdory skutečnosti, že barneexistuje, pokud je definován foo, bude tato funkce fungovat, protože se později definovaný barv rozsahu, který obklopuje foo.

Přesně totéž se děje v kódu tak učiníte, je to jen, že fooje výstup Some_Object(), nikoli definice funkce.

Jak řekl Alex, že vám může psát kód, jako je to neznamená, že byste měli .

Odpovězeno 27/08/2009 v 05:06
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more