2011-03-30 38 views

Trả lời

28

Bạn có thể sử dụng một nút lặp đi lặp lại, như thế này:

user_dir: &user_home /home/user 
user_pics: *user_home 

Tôi không nghĩ rằng bạn có thể nối mặc dù, vì vậy này sẽ không công việc:

user_dir: &user_home /home/user 
user_pics: *user_home/pics 
+0

Cảm ơn bạn đã xóa thông tin đó. Silly tôi cho suy nghĩ này là có thể. –

3

Dường như với tôi rằng bản thân YAML does not define way to do this.

Tin tốt là người tiêu dùng YAML có thể hiểu các biến.
Điều gì sẽ sử dụng YAML của bạn?

+0

Tệp yaml của tôi đóng vai trò là tệp cấu hình. Những gì tôi dán ở trên chỉ là một ví dụ, để minh họa cho vấn đề. – Geo

+0

Tệp cấu hình cho cái gì? –

+0

@ArnisL. [ví dụ:] https://github.com/Hi-Angel/yi/blob/7dd59102a84dec6a1e52f4ddca49d5f259a76fdc/example-configs/yi-emacs-vty-static/stack.yaml) để xác định đường dẫn đến thư mục mã nguồn khi xây dựng một mô-đun riêng biệt. –

3

Tôi sẽ sử dụng một mảng, sau đó tham gia chuỗi cùng với Dấu phân tách hệ điều hành hiện tại

như sau:

default: &default_path "you should not use paths in config" 
pictures: 
    - *default_path 
    - pics 
8

Nếu bạn đang sử dụng python với PyYaml, việc nối chuỗi có thể có trong tệp YAML. Thật không may đây chỉ là một giải pháp python, không phải là một phổ quát một:

với os.path.join:

user_dir: &home /home/user 
user_pics: !!python/object/apply:os.path.join [*home, pics] 

với string.join (cho đầy đủ vì lợi ích - Phương pháp này có sự linh hoạt để được sử dụng cho nhiều hình thức chuỗi tham gia:

user_dir: &home /home/user 
user_pics: !!python/object/apply:string.join [[*home, pics], /] 
+1

Hãy rõ ràng về ý nghĩa của phương pháp này - bạn cho phép trình phân tích cú pháp Pyyaml ​​thực thi mã Python tùy ý từ tệp đầu vào yaml.Đây là một vấn đề bảo mật cực kỳ nguy hiểm nếu bạn không kiểm soát nguồn của đầu vào. Nhiều chương trình sẽ sử dụng hàm 'yaml.safe_load()' để tránh vấn đề bảo mật. Trong trường hợp đó, mã của bạn sẽ không hoạt động. –

+0

bạn có ví dụ python3 cho tham gia chuỗi không? 'không thể tìm thấy mô-đun 'str' (Không có mô đun có tên 'str')' –

21

Thật đáng ngạc nhiên, vì mục đích của YAML neo & tham chiếu là sao chép yếu tố ra khỏi tệp dữ liệu YAML, không có cách tích hợp để nối chuỗi bằng cách sử dụng referenc es. Trường hợp sử dụng của bạn xây dựng một tên đường dẫn từ các bộ phận là một ví dụ tốt - phải có nhiều công dụng như vậy.

May mắn thay có một cách đơn giản để thêm chuỗi nối vào YAML thông qua thẻ tùy chỉnh trong Python.

import yaml 

## define custom tag handler 
def join(loader, node): 
    seq = loader.construct_sequence(node) 
    return ''.join([str(i) for i in seq]) 

## register the tag handler 
yaml.add_constructor('!join', join) 

## using your sample data 
yaml.load(""" 
user_dir: &DIR /home/user 
user_pics: !join [*DIR, /pics] 
""") 

mà kết quả trong:

{'user_dir': '/home/user', 'user_pics': '/home/user/pics'} 

Bạn có thể thêm các mục vào mảng, như " " hoặc "-", nếu chuỗi cần được phân tách.

+0

Cảm ơn, điều này làm việc cho tôi! – Chris

+2

Err… Vậy, nó có liên quan gì với YAML, một ngôn ngữ đánh dấu độc lập với Python, Haskell, hay bất cứ thứ gì? –

+0

YAML spec nói: "Cách gõ rõ ràng được biểu thị bằng thẻ sử dụng dấu chấm than ("! ") ... Thẻ địa phương cụ thể cho ứng dụng cũng có thể được sử dụng." Tôi đã cung cấp triển khai một loại rõ ràng đáp ứng thông số. Việc triển khai phải bằng một số ngôn ngữ. Tôi đã sử dụng Python vì OP cho biết anh ta muốn có một cách tiếp cận "KHÔ" hơn cho YAML của mình, và DRY là một thuật ngữ thường được người Python sử dụng nhiều nhất. Có thể triển khai cùng một thẻ tùy chỉnh bằng các ngôn ngữ khác. Nói cách khác, những gì OP hỏi không có sẵn trong vanilla YAML, nhưng có sẵn thông qua một cơ chế mở rộng được định nghĩa bởi YAML. –

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