2012-06-20 40 views
25

Lần đầu tiên người dùng trên tràn ngăn xếp và tôi rất vui được ở đây.Python - Cách tốt nhất/Sạch nhất để xác định danh sách hoặc từ điển liên tục

INTRO: Gần đây tôi đã bắt đầu cuộc phiêu lưu kỳ diệu vào thế giới lập trình Python - Tôi thích nó. Bây giờ mọi thứ đã diễn ra suôn sẻ trong quá trình chuyển đổi khó xử của tôi từ C, nhưng tôi đang gặp khó khăn trong việc tạo ra thứ gì đó đồng nghĩa với tệp HEADER (.h).

VẤN ĐỀ: Tôi có từ điển và danh sách có kích thước trung bình (khoảng 1.000 yếu tố), enums dài và '#defines' (cũng không thực sự), nhưng tôi không thể tìm được cách nào để tổ chức tất cả. Trong C, tôi sẽ ném tất cả chúng vào một tệp tiêu đề và không bao giờ nghĩ lại về nó, tuy nhiên, trong Python thì điều đó là không thể hoặc vì vậy tôi nghĩ.

GIẢI PHÁP HIỆN TẠI: Tôi đang khởi tạo tất cả các biến CONSTANT ở phía trên cùng của MODULE hoặc FUNCTION (mô-đun nếu có nhiều chức năng cần).

KẾT LUẬN: Tôi sẽ mãi mãi biết ơn nếu ai đó đã đưa ra một cách để SẠCH tổ chức biến cố định.

THANK YOU SO MUCH!

+6

Tôi chỉ muốn nói, chào mừng bạn đến với Stack và cảm ơn bạn đã bắt đầu ở đây với một câu hỏi được tổ chức tốt! – jdi

Trả lời

19

Đặt hằng số của bạn vào mô-đun riêng của họ:

# constants.py 

RED = 1 
BLUE = 2 
GREEN = 3 

Sau đó import module đó và sử dụng các hằng số:

import constants 

print "RED is", constants.RED 

Các hằng số có thể là bất kỳ giá trị mà bạn thích, tôi đã thể hiện số nguyên đây , nhưng danh sách và dicts sẽ làm việc giống nhau.

+0

Ý tưởng tuyệt vời. Bạn có biết độ trễ hoặc mất hiệu quả là như thế nào không? Bởi vì về mặt kỹ thuật, bạn đang nhập và không yêu cầu tra cứu mỗi lần bạn tham chiếu giá trị? – TSmith

+0

Bạn đang thực hiện tra cứu thuộc tính mỗi lần, đó là loại hoạt động xảy ra mọi lúc, nó thực sự không phải là điều đáng lo ngại. –

+1

@TSmith: Và nếu bạn cực kỳ quan tâm đến việc cạo bỏ một chút thời gian, bạn luôn có thể thực hiện 'từ các hằng số nhập RED' hoặc gán nó cho một biến ngay trước vòng lặp siêu dài:' red = hằng số.RED' – jdi

9

Thường thì tôi làm điều này:

File: constants.py

CONSTANT1 = 'asd' 
CONSTANT_FOO = 123 
CONSTANT_BAR = [1, 2, 5] 

File: your_script.py

from constants import CONSTANT1, CONSTANT_FOO 
# or if you want *all* of them 
# from constants import * 

... 

Bây giờ hằng bạn đang ở trong một tập tin và bạn có thể nhập và sử dụng chúng một cách độc đáo.

+0

Cảm ơn bạn, CC'cho bạn câu hỏi hiệu quả nếu bạn có thể trợ giúp. – TSmith

+0

Nếu bạn nhập tất cả chúng, hằng số sẽ trở thành biến toàn cầu và sẽ không yêu cầu tra cứu. Do lưu ý rằng Python là khoảng 200 lần chậm hơn so với C, do đó bạn sẽ không nhận thấy nhiều tăng tốc độ nếu bạn cố gắng tối ưu hóa vi mô. – Blender

+0

Cảm ơn bạn máy xay sinh tố. Câu hỏi tò mò nhanh, nếu tôi gán một biến cục bộ (trong một hàm) cho biến toàn cục đã nhập đó, thì biến cục bộ đó sẽ có một bản sao hoặc một tham chiếu đến toàn cục? – TSmith

2

Tạo một tệp riêng biệt constants.py và đặt tất cả các hằng số có liên quan trên toàn cầu vào đó. Sau đó, bạn có thể import constants để gọi chúng là constants.SPAM hoặc thực hiện (có thể đặt câu hỏi) from constants import * để chỉ chúng đơn giản là SPAM hoặc EGGS.

Trong khi chúng tôi ở đây, lưu ý rằng Python không hỗ trợ hằng số hằng số. Công ước này chỉ để đặt tên cho họ trong ALL_CAPS và hứa sẽ không làm thay đổi chúng.

+0

Haha yeah Tôi hứa :), nhưng những gì về hiệu quả thời gian chạy? Khi bạn nhập một mô-đun giống như "__inline" trong C? – TSmith

+0

@TSmith: Tôi sẽ không so sánh nó với nội tuyến vì nó thực sự chỉ nhập vào một đối tượng mô-đun không gian tên và nó chỉ một lần và chia sẻ nó trong bộ nhớ cho các lần nhập tiếp theo. – jdi

+0

Vâng, đó là một câu hỏi ngớ ngẩn mà tôi nghĩ về nó. Cảm ơn va chuc một ngay tôt lanh! – TSmith

Các vấn đề liên quan