2010-10-28 33 views
9

Tôi muốn sử dụng cả thời gian phân tích cú pháp và nội suy thời gian chạy cho các giá trị của tệp cấu hình configobj. Cách đơn giản nhất để làm nội suy chuỗi đơn giản trong Python là "%(foo)s" % somedict. Thật không may configobj sử dụng cơ chế nội suy tương tự và tôi chưa tìm thấy một cách để thoát khỏi nó. Giá trị lý tưởng của tôi sẽ trông giống như:Làm cách nào để thoát dấu% trong giá trị configobj?

othervar = foo 
someconfigobjkey = %(othervar)s %%(runtimevar)s 

Tuy nhiên, configobj sẽ cố gắng (và không) thay thế biến thứ hai. Một cách khác để trả lời câu hỏi này là cung cấp một cách khác nhau (configobj) để làm cả thời gian phân tích cú pháp và nội suy thời gian chạy.

Trả lời

1

Phiên bản mới của câu trả lời:

Bạn có thể sử dụng "" .format() (Python 2.6 trở lên) hoặc string.Template (Python 2.4 trở lên) cho phép nội suy runtime - cả hai đều sẽ loại bỏ cuộc xung đột.

(Phiên bản cũ giả định việc sử dụng các mô-đun ConfigParser tiêu chuẩn, vì thế mà ý kiến.)

+0

Như tôi đã nói trong câu hỏi ban đầu của tôi, tôi sử dụng configobj và không ConfigParser.Có lẽ tôi giả định mô-đun này được biết đến quá xa dù sao nó có thể được tìm thấy tại http://www.voidspace.org.uk/python/configobj.html –

+0

Vì thế rry, tôi không biết rằng mô-đun và không nhận ra nó như là một tên mô-đun trong bài viết của bạn hoặc. Bất kỳ lý do nào không chỉ sử dụng mô-đun ConfigParser tiêu chuẩn?Nếu điều này cũng phù hợp với bạn, vấn đề cũng sẽ được giải quyết :) –

+0

Trong sự lựa chọn phát triển công ty của các công cụ không phải lúc nào cũng được đưa ra. –

3

Vâng, không may configobj không theo quy tắc chuẩn của Python định dạng bình thường, vì vậy %%, mà nếu không sẽ là cách chính xác để thoát dấu phần trăm, thất bại. Có vẻ như một chút lỗi thiết kế đối với tôi.

Cách duy nhất tôi có thể nghĩ ra để có một %(foo)s chuỗi chữ trong một giá trị configobj sẽ được đảm bảo một phần của chuỗi đó là tự tạo ra bởi một sự thay thế:

>>> import configobj 
>>> c= configobject.ConfigObj() 
>>> c['foo']= 'bar' 
>>> c['pc']= '%' 
>>> c['v']= '%(foo)s %(pc)s(foo)s' 
>>> c['v'] 
'bar %(foo)s' 
2

Đào sâu hơn trong tài liệu tôi tìm thấy một giải pháp phù hợp hơn giải pháp được đề xuất bởi bobince: Sử dụng một công cụ nội suy khác, chẳng hạn như interpolation="template". Nó có hai ưu điểm.

  1. Không can thiệp với% dấu hiệu.
  2. Hỗ trợ thoát. ($$ bị suy để $.)

Các ví dụ sẽ trông giống như:

othervar = foo 
someconfigobjkey = $othervar %(runtimevar)s 
+0

Đây là phương pháp để sử dụng! Lưu ý rằng 'cfg = configobj.ConfigObj (…, nội suy = 'mẫu')' dường như không có hiệu lực khi xác thực và sau đó 'cfg.validate (…)' sẽ vẫn không thành công. Điều gì làm việc là thay đổi nội suy mặc định bằng cách đặt 'configobj.DEFAULT_INTERPOLATION = 'template''. Điều này làm việc trong cả Python 2 và Python 3. –

3

Hãy thử sử dụng '%' + '(foo) s'. Điều đó làm việc cho tôi khi giao dịch với ConfigParser.

8

Mọi thứ có thể đã thay đổi kể từ khi câu hỏi này được đăng, nhưng tôi đã phát hiện ra rằng bạn có thể thoát bằng cách sử dụng '%' char. Điều này làm việc cho tôi trong Python 3.

Trong file config.ini của tôi:

[LOGGING] 
format = %%(asctime)-15s %%(message)s 

Trong python script tập tin của tôi:

import configparser 

# Load configuration 
config = configparser.ConfigParser() 
config.read("config.ini") 

log_config = config['LOGGING'] 

print(log_config['format']) # prints out '%(asctime)-15s %(message)s' 

Hy vọng nó sẽ giúp ai đó trong tương lai (:

+0

Điều này làm việc cho tôi với SafeConfigParser! –

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