2012-04-26 36 views
6

Tôi chỉ nhấn vào hành vi mà mũi sẽ không chạy thử nghiệm được đánh dấu là có thể thực thi (như được mô tả trong a previous question). Tôi thấy điều này thật đáng ngạc nhiên, và tôi lãng phí thời gian để tìm hiểu tại sao mũi không chạy thử nghiệm của tôi trước khi tôi học về hành vi của mũi ở đây."Nhập an toàn" có nghĩa là gì trong Python?

Trong manpage cho nosetests, nó mô tả một tùy chọn để ghi đè lên hành vi mặc định:

--exe    Look for tests in python modules that are executable. 
        Normal behavior is to exclude executable modules, 
        since they may not be import-safe [NOSE_INCLUDE_EXE] 

Câu hỏi của tôi là: những gì hiện "nhập an toàn" nghĩa là gì? Ví dụ về mô-đun không an toàn-nhập khẩu là gì? Và một mô-đun không an toàn-nhập khẩu có thể được nhập khẩu an toàn bằng cách loại bỏ các bit thực thi, hoặc là có nhiều hơn nó?

Trả lời

5

Tôi không quen thuộc với mũi, nhưng tôi khá chắc chắn ý nghĩa của "nhập an toàn" là việc nhập mô-đun sẽ chỉ xác định mọi thứ, không được tắt và chạy nội dung.

Ý tưởng sẽ là nếu tệp .py được thiết kế để được thực thi dưới dạng tập lệnh, thì chức năng của tệp sẽ được bắt đầu khi thực thi mã phạm vi mô-đun. Điều này có thể được bảo vệ chống lại việc nhập khẩu với thủ thuật __name__ == '__main__', nhưng có thể không. Nếu nó không phải là, nhập khẩu nó có thể sẽ làm điều tương tự nó sẽ làm như một kịch bản khi được gọi không có đối số, mà trong một số trường hợp có thể là xấu.

Vì vậy, bạn có thể nói rõ ràng rằng không có tập lệnh thực thi nào có thể nguy hiểm khi nhập bằng cách chuyển cờ --exe hoặc bạn có thể xóa quyền thực thi khỏi tập lệnh của mình.

4

Nó đề cập đến các mô-đun có thể vừa được nhập hoặc được thực thi dưới dạng tập lệnh. Điều này thường được thực hiện bởi các đoạn mã sau:

if __name__ == "__main__": 
    print "running as script" 

Nếu một kịch bản đã được có nghĩa là để được thực thi không có việc kiểm tra này, nhập khẩu ngay lập tức sẽ thực hiện nó mà có lẽ sẽ kết thúc với tác dụng phụ không mong muốn hoặc ngoại lệ huy động.

5

"nhập an toàn" không có ý nghĩa cụ thể, được xác định. Trong trường hợp này, điểm là các mô-đun Python có thể làm điều gì đó khi chúng được nhập khẩu (hãy nhớ, nhập một mô-đun chỉ có nghĩa là thực hiện nó và lưu tất cả mọi thứ trong không gian tên của nó).

Nếu mô-đun được đánh dấu bằng bit thực thi, nose giả định rằng đây là trường hợp - và vì bạn có thể không muốn công cụ đó xảy ra mỗi khi bạn chạy thử nghiệm, nó sẽ bỏ qua mô-đun.

+0

@NiklasB. Xin lỗi, tôi không hiểu câu hỏi của bạn. 'Nó' là gì? – katrielalex

+0

Đừng bận tâm. Tôi đã đề cập đến 'mũi', nhưng theo thông báo lỗi, nó chỉ kiểm tra bit exec. –