Python YAML thành tênTuple
def test_index_tuple_command_handler(self). r = [namedtuple('test', 'a b')(1, 2), namedtuple('test', 'a b')(3, 4)] handler = type("TestHandler", (IndexTupleCommandHandler, object) . lambda. r})('test') # tự thực thi bình thường. assertEqual([1, 3], trình xử lý. tự xử lý ('a/*')). assertEqual("[1, 3]", trình xử lý. tự xử lý ('a/*;')). assertEqual(3, trình xử lý. tự xử lý ('a/1')). khẳng địnhEqual({'a'. 3, 'b'. 4}, trình xử lý. tự xử lý ('*/1')). khẳng địnhEqual('{"a". 3, "b". 4}', trình xử lý. handle('*;/1')) # tự ngoại lệ. assertRaises(Ngoại lệ, trình xử lý. xử lý, '') tự. assertRaises(Ngoại lệ, trình xử lý. xử lý, '*') tự. assertRaises(Ngoại lệ, trình xử lý. xử lý, '*;') tự. assertRaises(Ngoại lệ, trình xử lý. xử lý, 'a') tự. assertRaises(Ngoại lệ, trình xử lý. xử lý, 'a/') tự. assertRaises(Ngoại lệ, trình xử lý. xử lý, '/') tự. assertRaises(Ngoại lệ, trình xử lý. xử lý, '*/') tự. assertRaises(Ngoại lệ, trình xử lý. xử lý, '/*') tự. assertRaises(Ngoại lệ, trình xử lý. xử lý, 'blabla') tự. assertRaises(Ngoại lệ, trình xử lý. xử lý, 'bla/bla') tự. assertRaises(Ngoại lệ, trình xử lý. xử lý, 'bla/') tự. assertRaises(Ngoại lệ, trình xử lý. xử lý, '/bla')
Điều này sử dụng các gợi ý loại để chuyển đổi 's (các lớp giống như cấu trúc ngắn) thành JSON/YAML và quay lại các đối tượng python Show Nó cũng kết thúc from datetime import datetime from typing import NamedTuple from autotui.shortcuts import load_prompt_and_writeback class Water(NamedTuple): at: datetime glass_count: float if __name__ == "__main__": load_prompt_and_writeback(Water, "~/.local/share/water.json")4 để nhắc người dùng và xác thực đầu vào cho các loại phổ biến và có thể mở rộng thành bất kỳ loại nào bạn muốn Điều này được tích hợp sẵn để nhắc, xác thực và tuần tự hóa
Tôi đã viết điều này để tôi không phải viết đi viết lại mã python soạn sẵn để xác thực/tuần tự hóa/giải tuần tự hóa dữ liệu. Như một ví dụ mở rộng hơn về cách sử dụng nó, bạn có thể xem repo [ { "at": 1598856786, "glass_count": 2.0 }, { "at": 1598856800, "glass_count": 1.0 } ]9 của tôi, mà tôi sử dụng để theo dõi những thứ như calo/nước, v.v. Cài đặtĐiều này yêu cầu from autotui.shortcuts import load_from class Water(NamedTuple): #.. (same as above) if __name__ == "__main__": print(load_from(Water, "~/.local/share/water.json")) #[Water(at=datetime.datetime(2020, 8, 31, 6, 53, 6, tzinfo=datetime.timezone.utc), glass_count=2.0), # Water(at=datetime.datetime(2020, 8, 31, 6, 53, 20, tzinfo=datetime.timezone.utc), glass_count=1.0)]0, đặc biệt để hỗ trợ from autotui.shortcuts import load_from class Water(NamedTuple): #.. (same as above) if __name__ == "__main__": print(load_from(Water, "~/.local/share/water.json")) #[Water(at=datetime.datetime(2020, 8, 31, 6, 53, 6, tzinfo=datetime.timezone.utc), glass_count=2.0), # Water(at=datetime.datetime(2020, 8, 31, 6, 53, 20, tzinfo=datetime.timezone.utc), glass_count=1.0)]1 hiện đại Để cài đặt với pip, hãy chạy
Ví dụ, nếu tôi muốn đăng nhập bất cứ khi nào tôi uống nước vào một tệp from datetime import datetime from typing import NamedTuple from autotui.shortcuts import load_prompt_and_writeback class Water(NamedTuple): at: datetime glass_count: float if __name__ == "__main__": load_prompt_and_writeback(Water, "~/.local/share/water.json") Mà, sau khi chạy một vài lần, sẽ tạo ra from autotui.shortcuts import load_from class Water(NamedTuple): #.. (same as above) if __name__ == "__main__": print(load_from(Water, "~/.local/share/water.json")) #[Water(at=datetime.datetime(2020, 8, 31, 6, 53, 6, tzinfo=datetime.timezone.utc), glass_count=2.0), # Water(at=datetime.datetime(2020, 8, 31, 6, 53, 20, tzinfo=datetime.timezone.utc), glass_count=1.0)]2 [ { "at": 1598856786, "glass_count": 2.0 }, { "at": 1598856800, "glass_count": 1.0 } ] (thời gian dữ liệu được tuần tự hóa thành thời gian kỷ nguyên) Nếu tôi muốn tải lại các giá trị vào python, thì nó chỉ là from autotui.shortcuts import load_from class Water(NamedTuple): #.. (same as above) if __name__ == "__main__": print(load_from(Water, "~/.local/share/water.json")) #[Water(at=datetime.datetime(2020, 8, 31, 6, 53, 6, tzinfo=datetime.timezone.utc), glass_count=2.0), # Water(at=datetime.datetime(2020, 8, 31, 6, 53, 20, tzinfo=datetime.timezone.utc), glass_count=1.0)] Rất nhiều cách sử dụng của tôi về điều này chỉ sử dụng 3 chức năng trong mô-đun from autotui.shortcuts import load_from class Water(NamedTuple): #.. (same as above) if __name__ == "__main__": print(load_from(Water, "~/.local/share/water.json")) #[Water(at=datetime.datetime(2020, 8, 31, 6, 53, 6, tzinfo=datetime.timezone.utc), glass_count=2.0), # Water(at=datetime.datetime(2020, 8, 31, 6, 53, 20, tzinfo=datetime.timezone.utc), glass_count=1.0)]3; Kích hoạt tùy chọnMột số tùy chọn/tính năng có thể được bật bằng các biến môi trường chung hoặc bằng cách sử dụng trình quản lý bối cảnh để tạm thời bật một số lời nhắc/tính năng nhất định Ví dụ, có hai phiên bản của dấu nhắc from datetime import datetime from typing import NamedTuple from autotui.shortcuts import load_prompt_and_writeback class Water(NamedTuple): at: datetime glass_count: float if __name__ == "__main__": load_prompt_and_writeback(Water, "~/.local/share/water.json")9
Bạn có thể kích hoạt nó bằng cách
import autotui with autotui.options("LIVE_DATETIME"): autotui.prompt_namedtuple(...) Lời nhắc một phầnNếu bạn chỉ muốn nhắc một vài trường, bạn có thể cung cấp import autotui with autotui.options("LIVE_DATETIME"): autotui.prompt_namedtuple(...)6 hoặc import autotui with autotui.options("LIVE_DATETIME"): autotui.prompt_namedtuple(...)7 để cung cấp giá trị mặc định # water-now script -- set any datetime values to now from datetime import datetime from typing import NamedTuple from autotui import prompt_namedtuple from autotui.shortcuts import load_prompt_and_writeback class Water(NamedTuple): at: datetime glass_count: float load_prompt_and_writeback(Water, "./water.json", type_use_values={datetime: datetime.now()}) # or specify it with a function (don't call datetime.now, just pass the function) # so its called when its needed val = prompt_namedtuple(Water, attr_use_values={"at": datetime.now}) Vì bạn có thể chỉ định một hàm cho một trong các đối số đó -- bạn có thể tự do viết một hàm nhắc hoàn toàn tùy chỉnh để nhắc/lấy dữ liệu cho trường đó theo bất kỳ cách nào bạn muốn Ví dụ: để nhắc chuỗi bằng cách mở import autotui with autotui.options("LIVE_DATETIME"): autotui.prompt_namedtuple(...)8 thay thế from datetime import datetime from typing import NamedTuple, List, Optional from autotui.shortcuts import load_prompt_and_writeback import click def edit_in_vim() -> str: m = click.edit(text=None, editor="vim") return m if m is None else m.strip() class JournalEntry(NamedTuple): creation_date: datetime tags: Optional[List[str]] # one or more tags to tag this journal entry with content: str if __name__ == "__main__": load_prompt_and_writeback( JournalEntry, "~/Documents/journal.json", attr_use_values={"content": edit_in_vim}, ) Cũng có thể định nghĩa những thứ đó là một import autotui with autotui.options("LIVE_DATETIME"): autotui.prompt_namedtuple(...)9 trong lớp, vì vậy bạn không cần phải vượt qua trạng thái bổ sung class JournalEntry(NamedTuple): ... @staticmethod def attr_use_values() -> Dict: return {"content": edit_in_vim} # pulls attr_use_values from the function prompt_namedtuple(JournalEntry, "~/Documents/journal.json") YamlVì YAML là siêu bộ của JSON, nên điều này cũng có thể được sử dụng với các tệp YAML. from autotui.shortcuts import load_from class Water(NamedTuple): #.. (same as above) if __name__ == "__main__": print(load_from(Water, "~/.local/share/water.json")) #[Water(at=datetime.datetime(2020, 8, 31, 6, 53, 6, tzinfo=datetime.timezone.utc), glass_count=2.0), # Water(at=datetime.datetime(2020, 8, 31, 6, 53, 20, tzinfo=datetime.timezone.utc), glass_count=1.0)]3 sẽ tự động giải mã/ghi vào tệp YAML dựa trên phần mở rộng tệp # using the water example above if __name__ == "__main__": load_prompt_and_writeback(Water, "~/.local/share/water.yaml") Kết quả trong Bạn cũng có thể chuyển # water-now script -- set any datetime values to now from datetime import datetime from typing import NamedTuple from autotui import prompt_namedtuple from autotui.shortcuts import load_prompt_and_writeback class Water(NamedTuple): at: datetime glass_count: float load_prompt_and_writeback(Water, "./water.json", type_use_values={datetime: datetime.now()}) # or specify it with a function (don't call datetime.now, just pass the function) # so its called when its needed val = prompt_namedtuple(Water, attr_use_values={"at": datetime.now})1 cho các hàm # water-now script -- set any datetime values to now from datetime import datetime from typing import NamedTuple from autotui import prompt_namedtuple from autotui.shortcuts import load_prompt_and_writeback class Water(NamedTuple): at: datetime glass_count: float load_prompt_and_writeback(Water, "./water.json", type_use_values={datetime: datetime.now()}) # or specify it with a function (don't call datetime.now, just pass the function) # so its called when its needed val = prompt_namedtuple(Water, attr_use_values={"at": datetime.now})2 (hiển thị bên dưới) háiCái này có bộ chọn # water-now script -- set any datetime values to now from datetime import datetime from typing import NamedTuple from autotui import prompt_namedtuple from autotui.shortcuts import load_prompt_and_writeback class Water(NamedTuple): at: datetime glass_count: float load_prompt_and_writeback(Water, "./water.json", type_use_values={datetime: datetime.now()}) # or specify it with a function (don't call datetime.now, just pass the function) # so its called when its needed val = prompt_namedtuple(Water, attr_use_values={"at": datetime.now})3 cơ bản sử dụng # water-now script -- set any datetime values to now from datetime import datetime from typing import NamedTuple from autotui import prompt_namedtuple from autotui.shortcuts import load_prompt_and_writeback class Water(NamedTuple): at: datetime glass_count: float load_prompt_and_writeback(Water, "./water.json", type_use_values={datetime: datetime.now()}) # or specify it with a function (don't call datetime.now, just pass the function) # so its called when its needed val = prompt_namedtuple(Water, attr_use_values={"at": datetime.now})4, cho phép bạn chọn một mục từ danh sách/trình lặp from autotui import pick_namedtuple from autotui.shortcuts import load_from picked = pick_namedtuple(load_from(Water, "~/.local/share/water.json")) print(picked) Để cài đặt các phụ thuộc cần thiết, hãy cài đặt # water-now script -- set any datetime values to now from datetime import datetime from typing import NamedTuple from autotui import prompt_namedtuple from autotui.shortcuts import load_prompt_and_writeback class Water(NamedTuple): at: datetime glass_count: float load_prompt_and_writeback(Water, "./water.json", type_use_values={datetime: datetime.now()}) # or specify it with a function (don't call datetime.now, just pass the function) # so its called when its needed val = prompt_namedtuple(Water, attr_use_values={"at": datetime.now})3 và # water-now script -- set any datetime values to now from datetime import datetime from typing import NamedTuple from autotui import prompt_namedtuple from autotui.shortcuts import load_prompt_and_writeback class Water(NamedTuple): at: datetime glass_count: float load_prompt_and_writeback(Water, "./water.json", type_use_values={datetime: datetime.now()}) # or specify it with a function (don't call datetime.now, just pass the function) # so its called when its needed val = prompt_namedtuple(Water, attr_use_values={"at": datetime.now})6 Loại tùy chỉnhNếu bạn muốn hỗ trợ các loại tùy chỉnh hoặc chỉ định một cách đặc biệt để tuần tự hóa một NamedTuple khác theo cách đệ quy, bạn có thể chỉ định # water-now script -- set any datetime values to now from datetime import datetime from typing import NamedTuple from autotui import prompt_namedtuple from autotui.shortcuts import load_prompt_and_writeback class Water(NamedTuple): at: datetime glass_count: float load_prompt_and_writeback(Water, "./water.json", type_use_values={datetime: datetime.now()}) # or specify it with a function (don't call datetime.now, just pass the function) # so its called when its needed val = prompt_namedtuple(Water, attr_use_values={"at": datetime.now})7 và # water-now script -- set any datetime values to now from datetime import datetime from typing import NamedTuple from autotui import prompt_namedtuple from autotui.shortcuts import load_prompt_and_writeback class Water(NamedTuple): at: datetime glass_count: float load_prompt_and_writeback(Water, "./water.json", type_use_values={datetime: datetime.now()}) # or specify it with a function (don't call datetime.now, just pass the function) # so its called when its needed val = prompt_namedtuple(Water, attr_use_values={"at": datetime.now})8 để xử lý xác thực, tuần tự hóa, giải tuần tự hóa cho tên loại/thuộc tính đó Như một ví dụ phức tạp hơn, đây là trình xác thực cho (khoảng thời gian), được nhập dưới dạng MM. SS và các bộ nối tiếp tương ứng from datetime import datetime from typing import NamedTuple from autotui.shortcuts import load_prompt_and_writeback class Water(NamedTuple): at: datetime glass_count: float if __name__ == "__main__": load_prompt_and_writeback(Water, "~/.local/share/water.json")0 đầu ra from datetime import datetime from typing import NamedTuple from autotui.shortcuts import load_prompt_and_writeback class Water(NamedTuple): at: datetime glass_count: float if __name__ == "__main__": load_prompt_and_writeback(Water, "~/.local/share/water.json")1 Triết lý chung mà tôi đã thực hiện để tuần tự hóa và giải tuần tự hóa là gửi cảnh báo nếu các loại không phải là những gì NamedTuple mong đợi, nhưng vẫn tải các giá trị. Nếu tuần tự hóa không thể tuần tự hóa thứ gì đó, nó sẽ cảnh báo và nếu from datetime import datetime from typing import NamedTuple, List, Optional from autotui.shortcuts import load_prompt_and_writeback import click def edit_in_vim() -> str: m = click.edit(text=None, editor="vim") return m if m is None else m.strip() class JournalEntry(NamedTuple): creation_date: datetime tags: Optional[List[str]] # one or more tags to tag this journal entry with content: str if __name__ == "__main__": load_prompt_and_writeback( JournalEntry, "~/Documents/journal.json", attr_use_values={"content": edit_in_vim}, )0 không có cách xử lý, nó sẽ báo lỗi. Khi giải tuần tự hóa, tất cả các giá trị được tải từ các nguyên hàm JSON của chúng, sau đó được chuyển đổi thành các giá trị python tương ứng của chúng; . Điều này nhằm giúp tạo điều kiện thuận lợi cho các TUI nhanh chóng, tôi không muốn phải chiến đấu với nó (Nếu bạn biết mình đang làm gì và muốn bỏ qua những cảnh báo đó, bạn có thể đặt biến môi trường from datetime import datetime from typing import NamedTuple, List, Optional from autotui.shortcuts import load_prompt_and_writeback import click def edit_in_vim() -> str: m = click.edit(text=None, editor="vim") return m if m is None else m.strip() class JournalEntry(NamedTuple): creation_date: datetime tags: Optional[List[str]] # one or more tags to tag this journal entry with content: str if __name__ == "__main__": load_prompt_and_writeback( JournalEntry, "~/Documents/journal.json", attr_use_values={"content": edit_in_vim}, )1) Tại sao Namedtuples tốt hơn từ điển?Hơn nữa, vì các phiên bản bộ được đặt tên không có từ điển cho mỗi phiên bản, nên chúng nhẹ và không yêu cầu nhiều bộ nhớ hơn các bộ thông thường . Điều này làm cho chúng nhanh hơn từ điển.
YAML có hỗ trợ bộ dữ liệu không?Các loại được hỗ trợ là str, unicode, int, long, float, decimal. Số thập phân, bool, phức, chính tả, danh sách và bộ .
Namedtuple có thể thay đổi trong python không?[Lý do là các bộ dữ liệu được đặt tên trong Python là "bất biến", nghĩa là bạn không thể chọc trực tiếp một giá trị trường mới vào một bộ dữ liệu có tên hiện có. Các chuỗi trong Python cũng không thay đổi, nhưng các danh sách có thể thay đổi, vì vậy bạn có thể nói L[3] = 17. ]
Bạn có thể thay đổi Namedtuple không?Vì một bộ được đặt tên là một bộ và các bộ là bất biến, nên không thể thay đổi giá trị của một trường . Trong trường hợp này, chúng ta phải sử dụng một phương thức riêng khác _replace() để thay thế các giá trị của trường. Phương thức _replace() sẽ trả về một bộ có tên mới. |