Đ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
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
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"]
5from 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"]
6from 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"]
7from 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"]
8from 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[ { "at": 1598856786, "glass_count": 2.0 }, { "at": 1598856800, "glass_count": 1.0 } ]
0[ { "at": 1598856786, "glass_count": 2.0 }, { "at": 1598856800, "glass_count": 1.0 } ]
1[ { "at": 1598856786, "glass_count": 2.0 }, { "at": 1598856800, "glass_count": 1.0 } ]
2 [hoặc[ { "at": 1598856786, "glass_count": 2.0 }, { "at": 1598856800, "glass_count": 1.0 } ]
3][ { "at": 1598856786, "glass_count": 2.0 }, { "at": 1598856800, "glass_count": 1.0 } ]
4 [hoặc[ { "at": 1598856786, "glass_count": 2.0 }, { "at": 1598856800, "glass_count": 1.0 } ]
5][ { "at": 1598856786, "glass_count": 2.0 }, { "at": 1598856800, "glass_count": 1.0 } ]
6 [hoặc[ { "at": 1598856786, "glass_count": 2.0 }, { "at": 1598856800, "glass_count": 1.0 } ]
7]- cá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"]
3 khác [đệ quy]
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
pip install autotui
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ọn
Mộ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
- Cái bạn nhìn thấy ở trên bằng hộp thoại
- Phiên bản trực tiếp hiển thị ngày giờ được phân tích cú pháp trong khi nhập. Vì điều đó có thể gây ra một số độ trễ, nên có thể kích hoạt nó bằng cách đặt tùy chọn
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]]
9
Bạn có thể kích hoạt nó bằng cách
- thiết lập biến môi trường
import autotui with autotui.options["LIVE_DATETIME"]: autotui.prompt_namedtuple[...]
0 [tiền tố tên của tùy chọn vớiimport autotui with autotui.options["LIVE_DATETIME"]: autotui.prompt_namedtuple[...]
1], e. g. , thêmimport autotui with autotui.options["LIVE_DATETIME"]: autotui.prompt_namedtuple[...]
2 vàoimport autotui with autotui.options["LIVE_DATETIME"]: autotui.prompt_namedtuple[...]
3/import autotui with autotui.options["LIVE_DATETIME"]: autotui.prompt_namedtuple[...]
4 của bạn - sử dụng trình quản lý ngữ cảnh
import autotui with autotui.options["LIVE_DATETIME"]: autotui.prompt_namedtuple[...]
5
import autotui with autotui.options["LIVE_DATETIME"]: autotui.prompt_namedtuple[...]
Lời nhắc một phần
Nế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"]
Yaml
Vì 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ái
Cá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ỉnh
Nế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]