2008-11-13 26 views
8

Tôi đã đọc một phần của the docs và thấy rằng ConfigParser trả về danh sách các cặp khóa/giá trị cho các tùy chọn trong một phần. Tôi nhận thấy rằng các khóa không cần phải là duy nhất trong một phần, nếu không trình phân tích cú pháp sẽ chỉ trả về một ánh xạ. Tôi thiết kế giản đồ tập tin cấu hình của tôi xung quanh giả định này, sau đó buồn bã nhận ra rằng đây không phải là trường hợp:Các khóa duy nhất của ConfigParser của Python cho mỗi phần

>>> from ConfigParser import ConfigParser 
>>> from StringIO import StringIO 
>>> fh = StringIO(""" 
... [Some Section] 
... spam: eggs 
... spam: ham 
... """) 
>>> parser = ConfigParser() 
>>> parser.readfp(fh) 
>>> print parser.items('Some Section') 
[('spam', 'ham')] 

Sau đó, tôi quay lại và thấy một phần của các tài liệu mà tôi nên đã đọc:

Các mục thường được lưu trữ trong một từ điển nội trang dựng sẵn . Một loại thay thế từ điển có thể được chuyển đến phương thức khởi tạo ConfigParser. Ví dụ: nếu loại từ điển được thông qua để sắp xếp các khóa của nó, các phần sẽ là được sắp xếp trên ghi lại, cũng như các phím trong mỗi phần.

Để giữ sơ đồ tệp cấu hình hiện có (tôi thực sự thích bây giờ;) Tôi đang nghĩ đến việc truyền một đối tượng giống như bản đồ đã đề cập ở trên, tích lũy giá trị thay vì ghi đè chúng. Có cách nào đơn giản hơn để ngăn chặn sự sụp đổ khóa/giá trị mà tôi bị thiếu không? Thay vì làm một adapter điên (có thể phá vỡ nếu thay đổi thực hiện của ConfigParser) nên tôi chỉ cần viết một biến thể của ConfigParser chính nó?

Tôi cảm thấy đây có thể là một trong những khoảnh khắc 'duh' mà tôi chỉ thấy các giải pháp khó khăn.

[Edit:] Dưới đây là một ví dụ chính xác hơn về làm thế nào tôi muốn sử dụng cùng một chìa khóa nhiều lần:

[Ignored Paths] 
ignore-extension: .swp 
ignore-filename: tags 
ignore-directory: bin 

Tôi không thích cú pháp dấu phẩy phân cách danh sách bởi vì nó cứng trên mắt khi bạn mở rộng nó thành nhiều giá trị; ví dụ: danh sách được phân tách bằng dấu phẩy gồm năm mươi phần mở rộng sẽ không thể đọc được.

+1

Tôi nghĩ việc sử dụng danh sách sẽ dễ đọc hơn 50 dòng 'ignore-extension: ...' –

+1

Thật sao? Tôi không đồng ý ... với mỗi một dòng riêng biệt, bạn chỉ có thể quét xuống danh sách - Tôi chưa bao giờ tìm thấy các danh sách được phân cách bằng dấu phẩy của các phần mở rộng ba chữ cái là đẹp. Tôi cũng dự đoán mọi người muốn dễ dàng nhận xét bất kỳ tùy chọn cụ thể nào, những dòng riêng biệt nào có lợi cho bạn. – cdleary

Trả lời

11

ConfigParser không được thiết kế để xử lý các điều kiện như vậy. Hơn nữa, tập tin cấu hình của bạn không có ý nghĩa với tôi.

ConfigParser cung cấp cho bạn một cấu trúc giống như dict cho mỗi phần, vì vậy khi bạn gọi parser.items (section), tôi mong đợi kết quả tương tự như dict.items(), đây chỉ là danh sách các khóa/giá trị tuple . Tôi sẽ không bao giờ mong đợi để xem một cái gì đó như:

[('spam', 'eggs'), ('spam', 'ham')] 

Chưa kể, làm thế nào bạn mong chờ phần sau đây để xử ?:

parser.get('Some Section', 'spam') 

Đó là cách dự định để lấy giá trị.

Nếu bạn muốn lưu trữ nhiều giá trị cho cùng một chìa khóa, tôi sẽ đề nghị một cái gì đó như thế này trong tập tin cấu hình của bạn:

[Some Section] 
spam: eggs, ham 

Và điều này trong mã của bạn:

spam_values = [v.strip() for v in parser.get('Some Section', 'spam').split(',')] 

Tất nhiên, điều này sẽ chỉ hoạt động cho các giá trị không chứa dấu phẩy hoặc xử lý trích dẫn.Vì lý do đó, bạn nên sử dụng một kỹ thuật tiên tiến hơn (xem thisthis).

EDIT: Nếu bạn không nhớ phụ thuộc phụ, Bạn có thể xem ConfigObj, vốn hỗ trợ danh sách dưới dạng loại giá trị.

+0

Tôi mong đợi 'parser.get' trả về giá trị đầu tiên hoặc giá trị cuối cùng được liên kết với khóa. Tôi đã hy vọng rằng cấu hình được lưu trữ * nội bộ * như các mục. Tôi không thích cú pháp danh sách vì nó khó nhãn cầu hơn, nhưng tôi có thể phải chuyển đổi. – cdleary

+0

Tôi đang suy đoán, nhưng tôi nghĩ rằng một dict sẽ là một lớp cơ sở hiệu quả hơn cho một phần. Nếu đây là trường hợp, nó sẽ giải thích hành vi. Dù bằng cách nào, bạn sẽ cho mình một địa ngục đau đầu cố gắng để làm cho nó làm những gì bạn muốn. –

+0

Đủ công bằng. Tôi có đủ đau đầu. :) – cdleary

0

thiếu hụt này ConfigParser là lý do tại sao pyglet sử dụng để thay thế patched version of epydoc ConfigParser ini với simple format này:

name: pyglet 
url: http://www.pyglet.org/ 

output: html 
target: doc/api/ 
...  
module: pyglet 

exclude: pyglet.gl.gl 
exclude: pyglet.gl.agl 
exclude: pyglet.gl.lib_agl 
exclude: pyglet.gl.wgl 
... 

Nếu bạn không cần phần - Cách tiếp cận này có thể hữu ích.

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