2013-06-17 46 views
5

Cách đúng đắn để sử dụng mũi.tools và giữ gìn hạnh phúc?Công cụ mũi và pylint

Các mã sau đây:

''' 
This is a test 
''' 

import nose.tools 
import nose.tools.trivial 

nose.tools.assert_equal(1, 1) 
nose.tools.assert_equals(1, 1) 

nose.tools.trivial.assert_equal(1, 1) 
nose.tools.trivial.assert_equals(1, 1) 

Kết quả trong các lỗi pylint sau:

$ pylint -i y -r n /tmp/aseq.py 
************* Module aseq 
E1101: 8,0: Module 'nose.tools' has no 'assert_equal' member 
E1101: 9,0: Module 'nose.tools' has no 'assert_equals' member 
E1101: 11,0: Module 'nose.tools.trivial' has no 'assert_equal' member 
E1101: 12,0: Module 'nose.tools.trivial' has no 'assert_equals' member 

Tất nhiên, người ta có thể vô hiệu hóa E1101, là có một cách sạch hơn?

Trả lời

2

nose.tools.trivial chỉ đơn giản là kiểm tra unittest.TestCase lớp một cách nhanh chóng và làm cho tất cả các phương pháp "công cộng" bắt đầu từ assert sẵn từ nose.tools hoặc nose.tools.trivial:

mũi/tools/__ init__.py:

from nose.tools.nontrivial import * 
from nose.tools.nontrivial import __all__ as nontrivial_all 
from nose.tools.trivial import * 
from nose.tools.trivial import __all__ as trivial_all 

__all__ = trivial_all + nontrivial_all 

mũi/công cụ /trivial.py:

... 

class Dummy(unittest.TestCase): 
    def nop(): 
     pass 
_t = Dummy('nop') 

for at in [ at for at in dir(_t) 
      if at.startswith('assert') and not '_' in at ]: 
    pepd = pep8(at) 
    vars()[pepd] = getattr(_t, at) 
    __all__.append(pepd) 

... 

Pylint không thể xử lý hành vi "hacky" này.

Cân nhắc sử dụng nose.tools.eq_ thay vì assert_equalassert_equals (các phương pháp này thực sự giống nhau). Hy vọng rằng sẽ giúp.

+0

Đây là cái nhìn sâu sắc tốt. Mặc dù, có vẻ như, trong 'mũi/tools/trivial.py' "pep8" phiên bản của việc triển khai unittest của' assertEqual'/'assertEquals' được nối là' assert_equal'/'assert_equals' vv Nhưng 'assertEqual' và' assertEquals' không được thêm vào. arrow.tools cung cấp việc thực thi riêng 'eq_', khác với việc triển khai unittest (mặc dù cả hai đều được dự định giống nhau). – user650654

+0

Chắc chắn, điểm tốt, tôi có nghĩa là 'assert_equal' và' assert_equals'. Có, 'eq_' hoạt động hơi khác với phương thức' assertEqual/assertEquals' của 'unittest.TestCase'. – alecxe

4

Thay vì vô hiệu hóa E1101, bạn nên đặt:

ignored-classes=nose.tools,nose.tools.trivial 

trong .pylintrc, dưới phần [TYPECHECK].

Khi đứng trong pylint doc, tùy chọn này là "hữu ích cho các lớp với các thuộc tính tự động thiết lập".

+1

Điều này nghe có vẻ như nó sẽ làm việc, nhưng pylint vẫn còn ném cùng một lỗi. Tôi đang thiếu gì? Tôi đang sử dụng nosetests phiên bản 1.3.0. –

+0

Tôi chỉ cố gắng trong một virtualenv với python = 2.7.4, mũi = 1.3.0 và pylint = 1.0.0, với rcfile được bởi 'pylint --generate-rcfile': E1101 không khi tôi đặt 'ignored- lớp học trong rcfile. Bạn có thể thử điều tương tự không? –

1

pylint không hiểu mũi tiềm ẩn kỳ diệu. Như đã đề xuất, các giải pháp bao gồm tắt E1101 hoặc bỏ qua các lớp liên quan. Nhưng tốt nhất là đóng góp cho số pylint-brain project bằng cách gửi cho bạn một mô tả đơn giản về phần API không được Pylint nắm bắt. Điều này sẽ khá đơn giản từ tài liệu và ví dụ bạn sẽ tìm thấy ở đó.

+0

hmm, liên kết đó dường như đã chết. – user650654

+0

@ user650654 thực sự, sử dụng https://bitbucket.org/logilab/pylint-brain thay vì – sthenault

+0

Âm thanh như ý tưởng hay, nhưng tôi cần cài đặt pip để sử dụng trong sản xuất. Bất kỳ kế hoạch để phát hành một phiên bản để pip? –

0

Sử dụng pylint 1.4.3 (với 1.3.6 astroid, phổ biến 0.63.2, Python 2.7.10), các thiết lập mà đã được thay đổi là ignored-modules, và không ignored-classes:

ignored-modules=nose.tools,nose.tools.trivial