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

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"]
    
    5
  • 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"]
    
    6
  • 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"]
    
    7
  • 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"]
    
    8
  • 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
  • [
      {
        "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ới
    import autotui
    
    with autotui.options["LIVE_DATETIME"]:
        autotui.prompt_namedtuple[...]
    
    1], e. g. , thêm
    import autotui
    
    with autotui.options["LIVE_DATETIME"]:
        autotui.prompt_namedtuple[...]
    
    2 vào
    import 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]

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.

Chủ Đề