Câu trả lời của @ Paul92 là thảo luận chung tốt, nhưng tôi muốn đưa ra một giải pháp (ish) sạch có thể cho vấn đề này:
Một thư viện, mã này cần có khả năng thích ứng với mọi môi trường thời gian chạy, vì vậy bạn thực sự không thể yêu cầu STDIN
một số dữ liệu quan trọng. Đối với một, người dùng thư viện của bạn có thể không có sẵn stdin vì một số lý do. Thay vào đó, bạn có thể muốn sử dụng một số dạng mẫu chiến lược để tùy chỉnh cách lấy mã thông báo.
Trong Python, có lẽ tùy chọn tốt nhất là chuyển chiến lược tìm nạp mã thông báo dưới dạng tham số hàm. Một cái gì đó như thế:
def stdin_prompt():
return input("Enter code: ")
def my_library_function(arg1, arg2, ... argn, token_provider = stdin_prompt):
...
token = token_provider()
...
return stuff
# somewhere in the user code
stuff = my_library_function(a1, a2, ... an, lambda: "123456")
Hãy nghĩ về nó như thế này. Mã thông báo mà bạn yêu cầu, là một đối số cho chức năng thư viện. Vì giá trị của mã thông báo có thể không được biết đến tĩnh tại trang web cuộc gọi, bạn thực sự không thể yêu cầu giá trị làm đối số. Thay vào đó, người gọi phải cung cấp một chức năng sẽ chịu trách nhiệm cung cấp mã thông báo khi được gọi.
Tất cả trách nhiệm cung cấp các cơ chế chính xác của mã thông báo hiện được đưa ra khỏi chức năng thư viện. Người tiêu dùng của chức năng hiện chịu trách nhiệm nhận mã thông báo bằng bất kỳ phương tiện nào có sẵn trong thời gian chạy. Nó có thể yêu cầu STDIN, nhưng nó cũng có thể hoạt động như một cổng thư, chờ thư xuất hiện trong hộp thư đến, đọc nó, trích xuất mã thông báo và tự động hóa hoàn toàn quy trình. Nó có thể là một hộp thoại GUI hoặc một hình thức dựa trên web. Bất cứ điều gì thực sự - tất cả các tùy chọn hiện đang nằm trong tay của người tiêu dùng thư viện.