2012-01-31 61 views
8

Làm thế nào chúng ta có thể thấy biểu tượng bảng của mã nguồn python ???Bảng biểu tượng bằng Python

Ý tôi là, Python tạo một bảng biểu tượng cho mỗi chương trình trước khi thực sự chạy nó, Vì vậy, câu hỏi của tôi là làm thế nào tôi có thể nhận được bảng biểu tượng đó là đầu ra ???

+4

làm cho bạn nghĩ gì python tạo ra một bảng biểu tượng? –

+2

@WinstonEwert :: http://docs.python.org/library/symtable.html –

Trả lời

6

Nếu bạn đang yêu cầu về bảng biểu tượng được sử dụng khi tạo bytecode, hãy nhìn vào các mô-đun symtable. Ngoài ra, hai bài báo này bởi Eli Bendersky là hấp dẫn, và rất chi tiết:

Python Internals: Symbol tables, part 1

Python Internals: Symbol tables, part 2

Trong phần 2, anh chi tiết một hàm có thể in ra một mô tả của một symtable, nhưng có vẻ như đã được viết cho Python 3. Dưới đây là phiên bản dành cho Python 2.x:

def describe_symtable(st, recursive=True, indent=0): 
    def print_d(s, *args): 
      prefix = ' ' *indent 
      print prefix + s + ' ' + ' '.join(args) 

    print_d('Symtable: type=%s, id=%s, name=%s' % (
      st.get_type(), st.get_id(), st.get_name())) 
    print_d(' nested:', str(st.is_nested())) 
    print_d(' has children:', str(st.has_children())) 
    print_d(' identifiers:', str(list(st.get_identifiers()))) 

    if recursive: 
      for child_st in st.get_children(): 
        describe_symtable(child_st, recursive, indent + 5) 
5

Python không tạo bảng biểu tượng trước khi chương trình được thực thi. Trong thực tế, các loại và chức năng có thể được (và thường) được xác định trong quá trình thực thi.

Bạn có thể quan tâm đến việc đọc Why compile Python code?

Cũng xem câu trả lời chi tiết bởi @wberry

7

Python là năng động chứ không phải tĩnh trong tự nhiên. Thay vì một bảng biểu tượng như trong mã đối tượng đã biên dịch, máy ảo có một không gian tên địa chỉ cho các biến của bạn.

Chức năng dir() hoặc dir(module) trả về không gian tên hiệu dụng tại điểm đó trong mã. Nó chủ yếu được sử dụng trong các thông dịch viên tương tác nhưng có thể được sử dụng bởi mã là tốt. Nó trả về một danh sách các chuỗi, mỗi chuỗi là một biến với một số giá trị.

Hàm globals() trả về từ điển tên biến cho giá trị biến, trong đó tên biến được coi là toàn cục trong phạm vi tại thời điểm đó.

Hàm locals() trả về từ điển tên biến cho giá trị biến, trong đó tên biến được xem là cục bộ trong phạm vi tại thời điểm đó.

$ python 
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> locals() 
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None} 
>>> globals() 
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None} 
>>> dir() 
['__builtins__', '__doc__', '__name__', '__package__'] 
>>> import base64 
>>> dir(base64) 
['EMPTYSTRING', 'MAXBINSIZE', 'MAXLINESIZE', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_b32alphabet', '_b32rev', '_b32tab', '_translate', '_translation', '_x', 'b16decode', 'b16encode', 'b32decode', 'b32encode', 'b64decode', 'b64encode', 'binascii', 'decode', 'decodestring', 'encode', 'encodestring', 'k', 're', 'standard_b64decode', 'standard_b64encode', 'struct', 'test', 'test1', 'urlsafe_b64decode', 'urlsafe_b64encode', 'v'] 
+1

Sau đó, [symtable] (http://docs.python.org/library/symtable.html) làm gì? – voithos

+0

Bạn quên 'người dân địa phương()' – Marcin

+0

@voithos Ông hỏi cụ thể về mã nguồn Python. Tôi đã không được sử dụng mô-đun đó nhưng tôi tin rằng đó là để truy cập vào nội bộ VM hoặc nội bộ mở rộng C, mà không phải là điều tương tự. – wberry

2

Bạn có thể sẽ thưởng thức ghi Eli Bendersky của lên về chủ đề here

Trong CPython, bạn có mô-đun symtable có sẵn cho bạn.

Trong part 2, Eli mô tả một phương pháp mà đi bảng biểu tượng đó là vô cùng hữu ích:

def describe_symtable(st, recursive=True, indent=0): 
    def print_d(s, *args): 
     prefix = ' ' * indent 
     print(prefix + s, *args) 

    assert isinstance(st, symtable.SymbolTable) 
    print_d('Symtable: type=%s, id=%s, name=%s' % (
       st.get_type(), st.get_id(), st.get_name())) 
    print_d(' nested:', st.is_nested()) 
    print_d(' has children:', st.has_children()) 
    print_d(' identifiers:', list(st.get_identifiers())) 

    if recursive: 
     for child_st in st.get_children(): 
      describe_symtable(child_st, recursive, indent + 5) 
+0

Lưu ý rằng 'description_symtable' dường như đã được viết cho Python3. – voithos

Các vấn đề liên quan