Điều này có làm những gì bạn dự định không?
d = dict(globals())
d.update(locals())
Nếu tôi đọc tài liệu một cách chính xác, bạn tạo một bản sao của globals()
dict, sau đó bạn ghi đè lên bất kỳ bản sao và mục mới chèn từ locals()
dict (kể từ khi locals()
nên có ưu tiên trong phạm vi của mình, dù sao).
tôi đã không có bất kỳ may mắn trong việc một chức năng thích hợp để trả lại từ điển đầy đủ các biến trong phạm vi của gọi chức năng. Dưới đây là đoạn code (tôi chỉ sử dụng pprint để định dạng đầu ra độc đáo cho SO):
from pprint import *
def allvars_bad():
fake_temp_var = 1
d = dict(globals())
d.update(locals())
return d
def foo_bad():
x = 5
return allvars_bad()
def foo_good():
x = 5
fake_temp_var = "good"
d = dict(globals())
d.update(locals())
return d
pprint (foo_bad(), width=50)
pprint (foo_good(), width=50)
và đầu ra:
{'PrettyPrinter': <class pprint.PrettyPrinter at 0xb7d316ec>,
'__builtins__': <module '__builtin__' (built-in)>,
'__doc__': None,
'__file__': 'temp.py',
'__name__': '__main__',
'__package__': None,
'allvars_bad': <function allvars_bad at 0xb7d32b1c>,
'd': <Recursion on dict with id=3084093748>,
'fake_temp_var': 1,
'foo_bad': <function foo_bad at 0xb7d329cc>,
'foo_good': <function foo_good at 0xb7d32f0c>,
'isreadable': <function isreadable at 0xb7d32c34>,
'isrecursive': <function isrecursive at 0xb7d32c6c>,
'pformat': <function pformat at 0xb7d32bc4>,
'pprint': <function pprint at 0xb7d32b8c>,
'saferepr': <function saferepr at 0xb7d32bfc>}
{'PrettyPrinter': <class pprint.PrettyPrinter at 0xb7d316ec>,
'__builtins__': <module '__builtin__' (built-in)>,
'__doc__': None,
'__file__': 'temp.py',
'__name__': '__main__',
'__package__': None,
'allvars_bad': <function allvars_bad at 0xb7d32b1c>,
'd': <Recursion on dict with id=3084093884>,
'fake_temp_var': 'good',
'foo_bad': <function foo_bad at 0xb7d329cc>,
'foo_good': <function foo_good at 0xb7d32f0c>,
'isreadable': <function isreadable at 0xb7d32c34>,
'isrecursive': <function isrecursive at 0xb7d32c6c>,
'pformat': <function pformat at 0xb7d32bc4>,
'pprint': <function pprint at 0xb7d32b8c>,
'saferepr': <function saferepr at 0xb7d32bfc>,
'x': 5}
Lưu ý rằng trong đầu ra thứ hai, chúng tôi đã ghi đè fake_temp_var
, và x là hiện tại; đầu ra đầu tiên chỉ bao gồm các vars cục bộ trong phạm vi allvars_bad
.
Vì vậy, nếu bạn muốn truy cập phạm vi biến hoàn toàn, bạn không thể đặt người dân địa phương() bên trong một hàm khác.
Tôi đã nghi ngờ có một số loại đối tượng khung hình, tôi không biết (tìm nơi) tìm kiếm.
này hoạt động để spec của bạn, tôi tin rằng:
def allvars_good(offset=0):
frame = sys._getframe(1+offset)
d = frame.f_globals
d.update(frame.f_locals)
return d
def foo_good2():
a = 1
b = 2
return allvars_good()
->
{'PrettyPrinter': <class pprint.PrettyPrinter at 0xb7d6474c>,
'__builtins__': <module '__builtin__' (built-in)>,
'__doc__': None,
'__file__': 'temp.py',
'__name__': '__main__',
'__package__': None,
'a': 1,
'allvars_bad': <function allvars_bad at 0xb7d65b54>,
'allvars_good': <function allvars_good at 0xb7d65a04>,
'b': 2,
'foo_bad': <function foo_bad at 0xb7d65f44>,
'foo_good': <function foo_good at 0xb7d65f7c>,
'foo_good2': <function foo_good2 at 0xb7d65fb4>,
'isreadable': <function isreadable at 0xb7d65c6c>,
'isrecursive': <function isrecursive at 0xb7d65ca4>,
'pformat': <function pformat at 0xb7d65bfc>,
'pprint': <function pprint at 0xb7d65bc4>,
'saferepr': <function saferepr at 0xb7d65c34>,
'sys': <module 'sys' (built-in)>}
Tại sao bạn muốn làm điều đó? Rất có thể, có một cách tốt hơn để làm bất cứ điều gì bạn đang cố gắng làm. –
Tôi nghĩ đoạn trích sẽ rõ ràng. Tôi muốn nội suy các biến bên trong chuỗi. Bằng mọi cách, có thể có một cách tốt hơn. Xin vui lòng đề nghị một câu trả lời. –
Xin lỗi, đoạn mã không giải thích được ** tại sao ** bạn cần một thứ như vậy. Ngoài ra, các tham số đơn giản là cục bộ - nó không phải là một phạm vi riêng biệt. –