âmbito variável pitão

votos
2

Eu comecei a aprender sobre python e atualmente é a leitura através de um roteiro escrito por outra pessoa. Notei que globals estão espalhados por todo o script (e eu não gosto) .. Além disso, eu também notei que quando eu tiver um código como este

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

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

    some_function()

mesmo que eu não passar no foo em some_function (), mas some_function ainda é capaz de manipular foo (??!). Eu não gosto muito dessa embora seja um pouco semelhante ao fechamento Javascript (?). Eu gostaria de saber se é possível parar some_function () acessem foo se foo não é passado como um argumento função? Ou esta é a maneira preferida em python ??! (Eu estou usando python 2,5 sob Hardy ubuntu no momento)

Publicado 27/08/2009 em 03:41
fonte usuário
Em outras línguas...                            


3 respostas

votos
4

Esse script tem problemas muito graves com estilo e organização - por exemplo, se alguém importa que eles têm de alguma forma divina o fato de que eles têm que definir thescript.foopara uma instância de Some_Objectantes de chamar some_function... yeurgh -!)

É lamentável que você está tendo que aprender Python a partir de um roteiro mal escrito, mas eu não tenho certeza se entendi sua pergunta. O escopo de variáveis ​​em Python é moradores (incluindo argumentos), nonlocals (isto é, os locais de funções circundantes, para funções aninhados), globais, builtins.

É o que você quer parar o acesso a globals? some_function.func_globalsé somente leitura, mas você poderia fazer uma nova função com globals vazias:

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

chamando agora f()será dada uma exceção NameError: global name 'foo' is not defined. Você pode definir esta de volta no módulo com o nome some_function, ou até mesmo fazê-lo sistematicamente através de um decorador, por exemplo:

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

isso irá garantir a exceção acontece sempre que some_functioné chamado. Eu não sou claro sobre o benefício que você espera derivar de que, apesar de tudo. Talvez você pode esclarecer ...?

Respondeu 27/08/2009 em 04:11
fonte usuário

votos
2

Tanto quanto eu sei, a única maneira de parar some_functionde acessar fooé eliminar a foovariável a partir some_functionde escopo, possivelmente como:

tmp = foo
del foo
some_function()
foo = tmp

Claro, isso vai bater o seu código (atual) desde foonão existe no âmbito da some_functionanymore.

Em Python, variáveis ​​são pesquisadas localmente, em seguida, em escopo até a nível mundial, e, finalmente, built-ins são pesquisados.

Outra opção poderia ser:

with some_object as foo:
    some_function()

Mas então, você tem que, pelo menos, declarar some_object.__exit__, talvez some_object.__enter__também. O resultado final é que você controlar que fooé no âmbito da some_function.

Mais explicações sobre o "com" declaração aqui .

Respondeu 27/08/2009 em 03:53
fonte usuário

votos
1

Em python, algo como foonão é um valor, é um nome . Quando você tenta acessá-lo, python tenta encontrar o valor associado a ele (como dereferencing um ponteiro). Ele faz isso primeiro olhando no âmbito local (a função), em seguida, trabalhar o seu caminho para fora até que ele atinja o escopo do módulo (ou seja global) e, finalmente, builtins, até encontrar algo que corresponda ao nome.

Isso faz algo como este trabalho:

def foo():
    bar()

def bar():
    pass

Apesar do fato de que barnão existe quando você definida foo, a função vai funcionar porque você definiu mais tarde barem um escopo que envolve foo.

Exatamente a mesma coisa está acontecendo no código que você postar, é só que fooé a saída de Some_Object(), não uma definição de função.

Como Alex disse, o fato de que você pode escrever código como isso não significa que você deve .

Respondeu 27/08/2009 em 05:06
fonte usuário

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