Chơi golf với nhập Python


16

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:


11

Đ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__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.)
Alex A.

@AlexA Tôi thấy không có vấn đề gì với việc đặt nhập khẩu bên ngoài hàm được đặt tên.
frageum

Sau đó, có bao giờ sẽ có lúc importđược gọi bên trong một khối thụt lề? Chắc là không.
Alex A.

đặt nhập khẩu bên ngoài chức năng được đặt tên sẽ không hoạt động đối với các thách thức khi bạn chỉ viết một chức năng.
Sparr

6
xnor

4

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

Thí dụ:

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 ()

1

Hầu như không bao giờ.

__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 zlướ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.


1
Bạn có thể kiểm tra toán của bạn? Tôi thấy __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 timerandom.
xnor

@xnor Tôi đã không đếm dòng mới hai lần, nhưng tôi đã bỏ lỡ rằng bạn không cần dấu chấm trong phiên bản đó. Hãy cho tôi một phút, tôi sẽ cập nhật.
L3viathan

1
z=__import__("x").ylà một byte ngắn hơnfrom x import y as z
âm bảy

1
@negativeeven Ngắn hơn : from x import*;z=y.
L3viathan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.