Bu yüzden son zamanlarda işlev kapanışı kavramını anlıyorum. Anladığım kadar olduğu gibiPython, işlev kapatma işlevinin adını nasıl saklar?
def outer():
somevar = []
assert "somevar" in locals() and not "somevar" in globals()
def inner():
assert "somevar" in locals() and not "somevar" in globals()
somevar.append(5)
return somevar
return inner
function = outer()
somevar_returned = function()
assert id(somevar_returned) == id(function.func_closure[0].cell_contents)
, fonksiyon kapatılması amacı bu nesnenin çöp toplama önlemek için, nesneye aktif referansı tutmaktır. Aşağıdaki çalışıyor nedeni budur: şeydir
del outer
somevar_returned_2 = function()
assert id(somevar_returned) == id(function.func_closure[0].cell_contents)
assert id(somevar_returned) == id(somevar_returned_2)
(her zaman olduğu kadar anladığım gibi) inner
fonksiyonun çalıştırılmadan önce, Python halk değişkenler sözlüğünü yeniden. Bu sözlük irade içerir: Verilen cep içeriğine bağlı
- işlevin kapatma isimlerini varsayılan değeri veya parametreye bağlı
- işlevin parametreleri isimlerini (ve emsal isimleri üzerine yazabilirsiniz)
Soru, Python'un kapağın adını bağlamasını nerede saklıyor? Onu hiç bir yerde bulamıyorum.
Not: işlevin nitelikler: bizim için Neyse ki
>>> print "\n".join("%-16s : %s" % (e, getattr(function, e)) for e in dir(function) if not e.startswith("_") and e != "func_globals")
func_closure : (<cell at 0x2b919f6bc050: list object at [...]>,)
func_code : <code object inner at [...], file "<stdin>", line 4>
func_defaults : None
func_dict : {}
func_doc : None
func_name : inner
değil emin tam olarak ne anlama geldiğini. .. 'function.func_code.co_varnames'? – mata