yani biliyorum saçma bir örnek oldu ancak bunun sonucunda elma öğesinin bulunmadığını söylüyor. Projemde ilerlemeye başladım yavaş yavaş ama bu sorun benim veritabanı oluşturmamı engelliyor. Aslında kesin cevabı biliyorum ama gece geç olmaya başlayınca duruyor beynim maalesef lütfen yardımcı olun
Bir fonksiyonda tanımlanan değişkenlere fonksiyonun dışından erişebilmek aşağıdaki yolla mümkün:
def get_local_variables(func):
return {
identifier: value
for identifier, value in zip(
func.__code__.co_varnames,
func.__code__.co_consts[1:]
)
}
def f():
x = "hello"
y = "world"
assert get_local_variables(f) == {'x': 'hello', 'y': 'world'}
Python’un fonksiyon bytecode’larını yorumlarken kullandığı sabitlerden faydalanacaksak en baştan bir yorumlayıcı yazmamız lazım, bu hali ile kodu kandırmak çok kolay:
def get_local_variables(func):
return {
identifier: value
for identifier, value in zip(
func.__code__.co_varnames,
func.__code__.co_consts[1:]
)
}
def f():
x = "hello"
x += "a"
y = "world"
assert get_local_variables(f) == {'x': 'hello', 'y': 'world'}
Zaten değişkenin alacağı son değeri fonksiyonu çalıştırmadan bilemeyiz.
def get_local_variables(func):
load_const = []
store_fast = []
for instr in __import__("dis").Bytecode(func):
if instr.opname == "LOAD_CONST":
load_const += [eval(instr.argrepr)]
elif instr.opname == "STORE_FAST":
store_fast += [instr.argrepr]
load_const = load_const[:-1]
result = {}
for i, j in zip(load_const, store_fast):
if j in result:
if type(i) == type(result[j]):
result[j] += i
else:
result[j] = i
else:
result[j] = i
return result
def f():
x = "hello"
x += "a"
y = "world"
def g():
x = "hello"
x = 1
y = "world"
assert get_local_variables(f) == {"x": "helloa", "y": "world"}
assert get_local_variables(g) == {"x": 1, "y": "world"}
Edit: Kod biraz aceleye geldi aslında, aşağıdaki kısmı değiştirmek ve ilk başta instr.opname == "INPLACE_ADD" koşuluna göre bir değişiklik yapmak lazım.
if type(i) == type(result[j]):
result[j] += i
else:
result[j] = i
Edit: Aslında bir çok instr.opname’e göre değişiklikler yapılması gerekiyor olabilir. Benim yaptığım sadece basit bir girişim.