2013-04-12 40 views
5

Tôi đang cố gắng để tải một YAML trông như thế này:Sự khác biệt giữa! và !! trong yaml?

dist: !!opencv-matrix 
    rows: 380 
    cols: 380 
    dt: f 
    data: [ 0., 0., -1.88644529e+18, 2.45423365e+00, 11698176., 
     2.03862047e+00, -8.85501460e+10, 2.54738545e+00, 1.71208843e+20, 
     ... 
     2.44447327e+00 ] 

Mã tải chỉ là:

import yaml 
y = yaml.load(s) 

nơi s là YAML nạp vào một chuỗi.

tôi nhận được lỗi này:

yaml.constructor.ConstructorError: could not determine a constructor for the tag 'tag:yaml.org,2002:opencv-matrix' 
    in "<string>", line 382, column 7: 
    dist: !!opencv-matrix 

Đây là đủ công bằng, vì vậy tôi thêm các nhà xây dựng cho thẻ rằng:

def opencv_matrix(loader, node): 
    mapping = loader.construct_mapping(node) 
    mat = np.array(mapping["data"]) 
    mat.resize(mapping["rows"], mapping["cols"]) 
    return mat 

yaml.add_constructor(u"!!opencv-matrix", opencv_matrix) 
y = yaml.load(s) 

tôi vẫn nhận được lỗi. Tuy nhiên, nếu tôi thay thế opencv_matrix bằng opencv_matrix thì mọi thứ sẽ hoạt động.

Điều gì đang xảy ra ở đây?

+0

Làm cách nào bạn truy cập vào mat bằng các giá trị từ tệp yaml? Mảng được tạo ra dường như chỉ là số 0. – Acoop

Trả lời

4

Thẻ phụ như !!opencv-matrix thực sự là viết tắt của tag:yaml.org,2002:opencv-matrix (được đề cập trong reference card). Có vẻ như phương pháp add_constructor của PyYAML không xử lý chính xác ký hiệu viết tắt này.

Đây có thể là lỗi, tùy thuộc vào cách thẻ phụ được diễn giải (xem phần thứ hai bên dưới). Tôi đã gửi báo cáo lỗi here và hy vọng nó sẽ được giải quyết.

Thẻ chính như !opencv-matrix được xác định rõ ràng và tải có vẻ hoạt động mà không gặp bất kỳ sự cố nào trong PyYAML.

Nó phù hợp với tôi nếu bạn thay thế !!opencv-matrix bằng tag:yaml.org,2002:opencv-matrix trong cuộc gọi add_constructor.


Đối với câu hỏi ban đầu, AFAIK thẻ chính (!) đều mang tính kiểu do người dùng định nghĩa, trong khi thẻ thứ cấp (!!) có nghĩa là để đại diện cho các loại ngôn ngữ độc lập tiêu chuẩn defined here (do đó định dạng dài và ưa thích) .

Nếu đây là tệp do OpenCV tạo, thì có thể nó sẽ đơn giản hơn nếu các thẻ này được thay đổi thành thẻ chính trong ứng dụng.

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