2015-05-01 32 views
7

Tôi muốn xem liệu shlex có phải là lựa chọn tốt cho thứ tôi đang cố gắng xây dựng hay không, vì vậy tôi nghĩ mình sẽ đặt nó ở số debug mode để chơi với nó. Chỉ, nhà xây dựng của shlex mới có số này là weird thing it does: nó đặt self.debug thành 0 và sau đó kiểm tra ngay lập tức nếu đó là sự thật.Đặt shlex ở chế độ gỡ lỗi

… 
self.debug = 0 
self.token = '' 
self.filestack = deque() 
self.source = None 
if self.debug: 
    print 'shlex: reading from %s, line %d' \ 
      % (self.instream, self.lineno) 

Tôi biết Python có một số tính năng lập trình meta mạnh mẽ, nhưng tôi không thể tìm ra cách này được thiết kế để làm việc - ngay cả khi tôi ghi đè lên các nhà xây dựng, không có cách nào chương trình để có được giữa các thiết lập của giá trị và việc sử dụng nó.

Có nghĩa vụ phải là một cách để đưa ra tuyên bố trong điều kiện if self.debug (và nếu có, như thế nào?), Đó là lỗi, hoặc có khả năng thứ ba mà tôi chưa xem xét?

+1

Có lập trình chắc chắn có cách: http://ideone.com/wcPVRg. Nhưng nó trông giống như một mã thực sự cũ, [viết năm 1999] (https://github.com/python/cpython/blob/2bdca80eb5d7757d4542e9e12e425a54a11fe300/Lib/shlex.py) một cái gì đó và không ai đã chạm vào phần đó cả. o_O –

+0

Cuối cùng là một chút hardcoded, đây là cách hơi khác nhau: http://ideone.com/lDCKvu –

+0

Điều đó có vẻ giống như một lỗi. Nó là hoàn toàn hợp lý cho 'shlex' để yêu cầu bạn đặt' s.debug = 1' chỉ sau khi xây dựng ... nhưng trong trường hợp đó, không có lý do chính đáng để nó kiểm tra 'self.debug' trong initializer. – abarnert

Trả lời

2

Trước tiên, tôi chắc chắn bạn đã tìm thấy lỗi và bạn nên go report it. (Bạn nên chắc chắn rằng nó vẫn còn hiện diện trong the latest 3.x code, nhưng tôi chỉ kiểm tra, và nó là.) Tôi không thấy bất cứ điều gì bất hợp lý về shlex đối tượng không cho phép bạn thiết lập debug=1 cho đến sau khi chúng được khởi tạo ... nhưng trong trường hợp đó, họ không nên kiểm tra self.debug trong bộ khởi tạo, vì không có cách nào nó có thể được thiết lập.

Nhưng điều này không phải là một lỗi để khắc phục. Điều duy nhất bạn mất theo cách này là thông điệp đầu tiên, mà chỉ in ra các thuộc tính công cộng mà bạn có thể tự in. Vì vậy, ví dụ:

class debugging_shlex(shlex): 
    def __init__(self, *args, **kwargs): 
     # shlex is an old-style class in 2.7, so no super 
     shlex.__init__(self, *args, **kwargs) 
     self.debug = 1 
     print('shlex: reading from %s, line %d' \ 
       % (self.instream, self.lineno)) 

biết thêm thông tin cho các báo cáo lỗi:

  • Mã unreachable đã được bổ sung trong this 2000 change, và sự thay đổi duy nhất kể từ đó là để phù hợp với nó đến 80 cột.
  • Không có bài kiểm tra đơn vị cho đối số debug (không đáng ngạc nhiên, vì nó không được ghi lại và chỉ nói "nếu bạn muốn sử dụng, đọc nguồn" ... nhưng bạn có thể vẫn muốn thêm).
+0

Vâng, tôi sẽ mở một lỗi, nhưng [danh sách báo cáo lỗi mở chưa được xử lý trên 'shlex'] (http://bugs.python.org/issue?% 40search_text = shlex & ignore = file% 3Acontent & title = shlex &% 40columns = title & id = &% 40columns = id & stage = & creation = & creator = & activity = &% 40columns = activity &% 40sort = hoạt động & diễn viên = & nosy = & type = & components = & versions = & dependencies = & assignee = & từ khóa = & priority = & status = 1 &% 40columns = trạng thái & độ phân giải = & nosy_count = & message_count = &% 40group = &% 40pagesize = 50 &% 40startwith = 0 &% 40sortdir = on &% 40queryname = &% 40old-queryname = &% 40action = search) không cho tôi nhiều hy vọng. – kojiro

+0

[Đã mở lỗi] (http://bugs.python.org/issue24113). – kojiro

+0

@kojiro: Tôi đoán là nếu bạn gửi một bản vá loại bỏ 2 dòng đó, có một cơ hội lớn hơn 50/50 nó sẽ được chấp nhận; nếu bạn không gửi một bản vá, không ai khác sẽ bận tâm, và cuối cùng thì nó sẽ là một lỗi «shlex' 47 tháng tuổi mà không ai quan tâm. – abarnert

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