Khi nào thì có lợi khi sử dụng nội tuyến, sử dụng một lần nhập bằng Python?
Ví dụ:
__import__("x").doSomething()
Là ở trên bao giờ ngắn hơn dưới đây?
import x
x.doSomething()
Hoặc là
from x import*
doSomething()
Khi nào thì có lợi khi sử dụng nội tuyến, sử dụng một lần nhập bằng Python?
Ví dụ:
__import__("x").doSomething()
Là ở trên bao giờ ngắn hơn dưới đây?
import x
x.doSomething()
Hoặc là
from x import*
doSomething()
Câu trả lời:
Điều này có thể hữu ích nếu bạn muốn sử dụng một mô-đun chỉ một lần trong hàm lambda ẩn danh, vì nó cho phép bạn tránh viết một câu lệnh riêng:
lambda x:__import__('SomeModule').foo(x,123)
ngắn hơn một byte so với
from SomeModule import*;f=lambda x:foo(x,123)
Nếu mã là một chức năng hoặc chương trình được đặt tên, thì __import__
không có khả năng giúp đỡ ngoại trừ trong những trường hợp cực đoan hoặc khó khăn nhất.
import
được gọi bên trong một khối thụt lề? Chắc là không.
f=
vì các hàm ẩn danh được cho phép và có thể có nội dung bên ngoài hàm .
Khi nhập nhiều mô-đun với tên đủ dài, có thể hữu ích để gán __import__
hàm cho một biến ngắn hơn và sử dụng nó cho nhập khẩu
Báo cáo nhập thông thường - 97 byte
từ nhập itertools * từ nhập dữ liệu * danh sách in (hoán vị ("abc")) in datetime.now ()
Gán __import__
cho i
- 94 byte:
i = __ nhập _ danh sách in (i ("itertools"). hoán vị ("abc")) in i ("datetime"). datetime.now ()
__import__("x").doSomething()
cần 15+ x ký tự để chỉ một mô-đun có tên có độ dài x .
import x\nx.doSomething()
cần 9 + 2 * x ký tự. Các hàm này chồng lấp tại x = 6, do đó, so với cách này, bất kỳ mô-đun nào có tên dài hơn sẽ tốt hơn khi sử dụng __import__
, bất kỳ lợi ích nào ngắn hơn từ nhập khẩu thông thường:
Tuy nhiên, from x import*\ndoSomething()
chỉ cần 14+ x ký tự, vì vậy so với nhập thông thường, nó không có giá trị trừ khi tên mô-đun dài hơn 5 ký tự:
Tất cả điều này giả định rằng bạn đang đề cập đến một chức năng / lớp / bất cứ điều gì chỉ một lần. Nếu bạn tham khảo nó nhiều lần, các công thức sẽ thay đổi và phiên bản sau có thể trở thành người chiến thắng. Trong trường hợp bạn sử dụng một cái gì đó dài từ một mô-đun đã nhập nhiều lần, nhưng một phiên bản khác sẽ thắng:
from x import y as z
lưới bạn 18+ x + y + z * ( n +1) ký tự cho n sử dụng z , đây là một cải tiến lớn nếu y lớn, vì z có thể được tạo 1.
__import__("x").doSomething()
là một char ngắn hơn from x import*;doSomething()
. Có lẽ bạn đang tính dòng mới là hai ký tự? Và tôi nhớ lại điểm hòa vốn là 5, nằm giữa time
và random
.
z=__import__("x").y
là một byte ngắn hơnfrom x import y as z
from x import*;z=y
.
__import__
sẽ giúp bên trong một hàm được đặt tên vì nó sẽ nằm trong một khối thụt vào. Một nhập khẩu sẽ có chi phí thêm vì nó trên hai dòng và thụt lề. (Đó là giả sử rằng nhập khẩu không được phép bên ngoài chức năng.)