2009-05-05 20 views
12

Vì vậy, tôi đang đùa giỡn với ý tưởng làm cho bản thân mình (và bất cứ ai quan tâm đến việc sử dụng nó tất nhiên) một chút thư viện boilerplate trong Python cho Pygame. Tôi muốn một hệ thống nơi cài đặt cho ứng dụng được cung cấp với một tập tin yaml.Yaml hợp nhất trong Python

Vì vậy, tôi đã nghĩ rằng nó sẽ hữu ích nếu thư viện cung cấp cây yaml mặc định và hợp nhất nó với người dùng được cung cấp. Vì lợi ích về khả năng sử dụng, tôi tự hỏi nếu có thể có bất kỳ ai ở đó có thể chia sẻ thói quen ở đâu:

Trong trường hợp người dùng cung cấp yaml chồng lên mặc định, người dùng cung cấp các chi nhánh thay thế thư viện được cung cấp.

Trong mọi trường hợp người dùng cung cấp yaml không chồng lên cây mặc định, cây mặc định vẫn tiếp tục.

Bất kỳ nhánh thừa nào trong cây do người dùng cung cấp yaml được nối vào.

Tôi biết giải thích này là tiết do nó có thể rõ ràng những gì tôi yêu cầu. Tôi tự hỏi nếu nó là một chút nhiều để có được miễn phí.

+0

Làm cách nào để xử lý các loại xung đột, chẳng hạn như danh sách trong cây mặc định và từ điển trong cây cấu hình? Nó có nên hợp nhất các danh sách, và trong trường hợp đó, làm thế nào? –

Trả lời

21

Bạn có thể sử dụng PyYAML cho phân tích các tập tin, và sau đó là chức năng sau đây để hợp nhất hai cây:

def merge(user, default): 
    if isinstance(user,dict) and isinstance(default,dict): 
     for k,v in default.iteritems(): 
      if k not in user: 
       user[k] = v 
      else: 
       user[k] = merge(user[k],v) 
    return user 

Tùy chọn, bạn có thể làm một deep-copy của người sử dụng cây trước khi gọi chức năng này.

+0

Tại sao không user.update (mặc định)? –

+0

Đó là mặc định.update (người dùng), vì dict.update ghi đè các khóa hiện có. Để biết nơi để recurse sâu hơn vào cây, tôi sẽ phải lặp qua các từ điển tham gia, đó là lớn hơn hoặc bằng lớn nhất của người sử dụng và mặc định. –

+2

rất tốt, cảm ơn! Mặc dù imho nó bỏ lỡ sự hợp nhất giữa các mảng: nếu một khóa có [1,2] và phím kia có [2,3] thì phần tử đã hợp nhất sẽ có [1,2,3]. Liệu tôi có sai? – Riccardo