Biến tham chiếu từ điển Python

Nếu tôi hiểu chính xác thì bạn muốn truy cập các giá trị

dictn.a = 10, dictn.b = 11, dictn.d = '25'
dictn.a = 42, dictn.b = 11, dictn.c = 'hello', dictn.d = '25'
6 không phải thông qua toán tử
dictn.a = 10, dictn.b = 11, dictn.d = '25'
dictn.a = 42, dictn.b = 11, dictn.c = 'hello', dictn.d = '25'
7 và tên khóa mà sử dụng trực tiếp các khóa làm định danh

Bạn đề xuất rằng bạn muốn đưa các khóa từ điển làm biến cục bộ. Đây chắc chắn là một cách làm tồi tệ và thực tế là không thể [như Eryk giải thích]

Một giải pháp thay thế có chức năng gần như tương tự nhưng hầu như không có hậu quả xấu nào là thay đổi lớp

dictn.a = 10, dictn.b = 11, dictn.d = '25'
dictn.a = 42, dictn.b = 11, dictn.c = 'hello', dictn.d = '25'
6 để bạn có thể sử dụng các khóa từ điển làm thuộc tính đối tượng. Tất nhiên, theo cách này, bạn chỉ có thể truy cập các khóa được đặt tên là mã định danh Python hợp lệ

class AttrDict[dict]:
    """Provide dictionary with items accessible as object attributes."""
    def __getattr__[self, attr: str] -> Any:
        try:
            return self[attr]
        except KeyError as exception:
            raise AttributeError[f'AttrDict has no key {attr!r}'] from exception

    def __setattr__[self, attr: str, value: Any] -> None:
        self[attr] = value

    def __delattr__[self, attr: str] -> Any:
        try:
            del self[attr]
        except KeyError as exception:
            raise AttributeError[f'AttrDict has no key {attr!r}'] from exception

Sau đó, bạn có thể làm điều này

dictn = AttrDict[{"a":10,"b":11,"d":"25"}]
print[f"{dictn.a = }, {dictn.b = }, {dictn.d = }"]
dictn.a = 42
dictn.c = 'hello'
print[f"{dictn.a = }, {dictn.b = }, {dictn.c = }, {dictn.d = }"]

đầu ra

dictn.a = 10, dictn.b = 11, dictn.d = '25'
dictn.a = 42, dictn.b = 11, dictn.c = 'hello', dictn.d = '25'

So sánh với giải pháp của Eryk [______29]

  • Bạn định nghĩa một lớp mới
  • Lớp này là một loại phụ của
    dictn.a = 10, dictn.b = 11, dictn.d = '25'
    dictn.a = 42, dictn.b = 11, dictn.c = 'hello', dictn.d = '25'
    
    6 và vẫn hoạt động như một
    dictn.a = 10, dictn.b = 11, dictn.d = '25'
    dictn.a = 42, dictn.b = 11, dictn.c = 'hello', dictn.d = '25'
    
    6
  • Bạn không cần phải chuyển đổi giữa
    dictn.a = 10, dictn.b = 11, dictn.d = '25'
    dictn.a = 42, dictn.b = 11, dictn.c = 'hello', dictn.d = '25'
    
    6 và
    dictn = AttrDict[{"a":10,"b":11,"d":"25"}]
    print[f"{dictn.a = }, {dictn.b = }, {dictn.d = }"]
    dictn.a = 42
    dictn.c = 'hello'
    print[f"{dictn.a = }, {dictn.b = }, {dictn.c = }, {dictn.d = }"]
    
    0 bằng cách tạo một đối tượng mới

Nó trực giao với vấn đề chính của @sai_ram_basa, nhưng cần phải rõ ràng,

dictn = AttrDict[{"a":10,"b":11,"d":"25"}]
print[f"{dictn.a = }, {dictn.b = }, {dictn.d = }"]
dictn.a = 42
dictn.c = 'hello'
print[f"{dictn.a = }, {dictn.b = }, {dictn.c = }, {dictn.d = }"]
1 là một hàm dựng sẵn, không phải là một từ khóa hoặc hằng số đơn lẻ [như
dictn = AttrDict[{"a":10,"b":11,"d":"25"}]
print[f"{dictn.a = }, {dictn.b = }, {dictn.d = }"]
dictn.a = 42
dictn.c = 'hello'
print[f"{dictn.a = }, {dictn.b = }, {dictn.c = }, {dictn.d = }"]
2,
dictn = AttrDict[{"a":10,"b":11,"d":"25"}]
print[f"{dictn.a = }, {dictn.b = }, {dictn.d = }"]
dictn.a = 42
dictn.c = 'hello'
print[f"{dictn.a = }, {dictn.b = }, {dictn.c = }, {dictn.d = }"]
3 và
dictn = AttrDict[{"a":10,"b":11,"d":"25"}]
print[f"{dictn.a = }, {dictn.b = }, {dictn.d = }"]
dictn.a = 42
dictn.c = 'hello'
print[f"{dictn.a = }, {dictn.b = }, {dictn.c = }, {dictn.d = }"]
4], vì vậy trong Python, nó có thể được ẩn và định nghĩa lại như bất kỳ hàm nào khác

Theo nghĩa đó, mẫu mã của bạn không thực sự rõ ràng hơn bản gốc và có thể nói là kém hơn, vì nó che khuất một tên từ phạm vi toàn cầu ở phạm vi chức năng cục bộ, điều này có khả năng gây nhầm lẫn cao [đặc biệt là xem xét nó dường như

Tất nhiên, bản gốc cũng không lý tưởng vì người đọc [như bạn] có thể dễ dàng bị nhầm lẫn và cho rằng nó đề cập đến hàm nội trang chứ không phải là một biến cục bộ, nó làm cho nội dung không tầm thường để truy cập nếu cần [một

Do đó, giải pháp là đổi tên biến thành tên khác phù hợp, chẳng hạn như

dictn = AttrDict[{"a":10,"b":11,"d":"25"}]
print[f"{dictn.a = }, {dictn.b = }, {dictn.d = }"]
dictn.a = 42
dictn.c = 'hello'
print[f"{dictn.a = }, {dictn.b = }, {dictn.c = }, {dictn.d = }"]
6,
dictn = AttrDict[{"a":10,"b":11,"d":"25"}]
print[f"{dictn.a = }, {dictn.b = }, {dictn.d = }"]
dictn.a = 42
dictn.c = 'hello'
print[f"{dictn.a = }, {dictn.b = }, {dictn.c = }, {dictn.d = }"]
7, v.v. hoặc tốt hơn nữa, có chức năng thích hợp [hàm tạo của không gian tên, lệnh tùy chỉnh, v.v.] thay vào đó, hãy sử dụng
dictn = AttrDict[{"a":10,"b":11,"d":"25"}]
print[f"{dictn.a = }, {dictn.b = }, {dictn.d = }"]
dictn.a = 42
dictn.c = 'hello'
print[f"{dictn.a = }, {dictn.b = }, {dictn.c = }, {dictn.d = }"]
8 [điều này sẽ tự động đảm bảo các khóa là tên Python hợp lệ], ngoài các thay đổi khác

cướp

Điểm đằng sau bài đăng của tôi là nói thêm về

dictn = AttrDict[{"a":10,"b":11,"d":"25"}]
print[f"{dictn.a = }, {dictn.b = }, {dictn.d = }"]
dictn.a = 42
dictn.c = 'hello'
print[f"{dictn.a = }, {dictn.b = }, {dictn.c = }, {dictn.d = }"]
9 đã sửa đổi [theo như tôi có thể nói] những gì OP đang tìm kiếm

Nếu vậy, điều này không rõ ràng từ bài đăng của bạn, xin lỗi, vì nó đã nêu

cướp

dictn.a = 10, dictn.b = 11, dictn.d = '25'
dictn.a = 42, dictn.b = 11, dictn.c = 'hello', dictn.d = '25'
0 Trả về giá trị băm của đối tượng [nếu có]. Đó là điều bạn muốn?

OP chỉ đơn giản là sử dụng

dictn = AttrDict[{"a":10,"b":11,"d":"25"}]
print[f"{dictn.a = }, {dictn.b = }, {dictn.d = }"]
dictn.a = 42
dictn.c = 'hello'
print[f"{dictn.a = }, {dictn.b = }, {dictn.c = }, {dictn.d = }"]
1 làm tên cục bộ của từ điển [thường được gọi là bảng băm/bản đồ băm/bảng băm trong các ngữ cảnh khác]; . Với khả năng nhầm lẫn rõ ràng [và thực sự, đã nhận ra], tôi muốn làm rõ điểm đó

Và trong phần bài đăng của bạn, nơi bạn thảo luận về khoản hoàn trả đã sửa đổi, nó cũng có vẻ không thực sự tương ứng với những gì OP đã nêu trong bài đăng của họ;

cướp

nhưng như OP dường như đã đi AWAL

Tôi sẽ không coi việc không trả lời chỉ trong hai ngày vào Thứ Sáu và Thứ Bảy là "AWAL [sic]", mà là của riêng mỗi người

cướp

Vâng, tôi bối rối trước việc anh ấy sử dụng [hay đúng hơn là lạm dụng]

dictn = AttrDict[{"a":10,"b":11,"d":"25"}]
print[f"{dictn.a = }, {dictn.b = }, {dictn.d = }"]
dictn.a = 42
dictn.c = 'hello'
print[f"{dictn.a = }, {dictn.b = }, {dictn.c = }, {dictn.d = }"]
1 và một lần nữa chỉ có thể đoán ý định của anh ấy

Như đã giải thích trong câu trả lời trước của tôi,

dictn = AttrDict[{"a":10,"b":11,"d":"25"}]
print[f"{dictn.a = }, {dictn.b = }, {dictn.d = }"]
dictn.a = 42
dictn.c = 'hello'
print[f"{dictn.a = }, {dictn.b = }, {dictn.c = }, {dictn.d = }"]
1 chỉ đơn giản là một tên biến cục bộ cho từ điển đã thông qua và mọi thứ trong cách sử dụng của OP hoàn toàn phù hợp với điều đó; . Mặc dù có khả năng gây nhầm lẫn cho người khác, nhưng đó không phải là sự “lạm dụng” bất cứ điều gì mỗi lần nói, chỉ là một lựa chọn đặt tên dưới mức tối ưu [trong số một số lựa chọn khác] và thực sự là một vấn đề nhỏ so với các vấn đề quan trọng hơn nhiều với mã

cướp

Điểm đằng sau bài đăng của tôi là nói thêm về

dictn = AttrDict[{"a":10,"b":11,"d":"25"}]
print[f"{dictn.a = }, {dictn.b = }, {dictn.d = }"]
dictn.a = 42
dictn.c = 'hello'
print[f"{dictn.a = }, {dictn.b = }, {dictn.c = }, {dictn.d = }"]
9 đã sửa đổi [theo như tôi có thể nói] những gì OP đang tìm kiếm

Tôi giải thích việc sử dụng

dictn.a = 10, dictn.b = 11, dictn.d = '25'
dictn.a = 42, dictn.b = 11, dictn.c = 'hello', dictn.d = '25'
9 chỉ là một ví dụ về việc sử dụng một biến cục bộ động có tên là
dictn.a = 10, dictn.b = 11, dictn.d = '25'
dictn.a = 42, dictn.b = 11, dictn.c = 'hello', dictn.d = '25'
5. Trong trường hợp này, người đăng ban đầu cũng có thể sử dụng các biến cục bộ có tên là
dictn.a = 10, dictn.b = 11, dictn.d = '25'
dictn.a = 42, dictn.b = 11, dictn.c = 'hello', dictn.d = '25'
61 và
dictn.a = 10, dictn.b = 11, dictn.d = '25'
dictn.a = 42, dictn.b = 11, dictn.c = 'hello', dictn.d = '25'
62. Điều này không được hỗ trợ trong phạm vi chức năng trong Python 3. x. Trong 2. x, có thể có trong một hàm không lồng nhau nếu tính năng cục bộ nhanh bị vô hiệu hóa trong phạm vi [e. g. bằng cách sử dụng câu lệnh
dictn.a = 10, dictn.b = 11, dictn.d = '25'
dictn.a = 42, dictn.b = 11, dictn.c = 'hello', dictn.d = '25'
63]. Điều đó nói rằng, sử dụng các biến cục bộ động [i. e. cập nhật
dictn.a = 10, dictn.b = 11, dictn.d = '25'
dictn.a = 42, dictn.b = 11, dictn.c = 'hello', dictn.d = '25'
3 bằng ánh xạ] nên được giữ ở mức tối thiểu ngay cả trong các ngữ cảnh mà nó được hỗ trợ về mặt kỹ thuật. Không hiểu rõ nguồn gốc của biến và giá trị của nó khi đọc định nghĩa hàm. Có lẽ biến không thực sự cục bộ [tôi. e. một biến không được khai báo từ phạm vi bên ngoài]. Nếu nó là một cục bộ động, có thể có nhiều bản cập nhật của
dictn.a = 10, dictn.b = 11, dictn.d = '25'
dictn.a = 42, dictn.b = 11, dictn.c = 'hello', dictn.d = '25'
3, vậy nó bắt nguồn từ đâu?

Bạn có thể lưu trữ một biến trong từ điển Python không?

Tuy nhiên, có những lúc bạn muốn lưu trữ nhiều biến, nhưng truy cập chúng bằng các mối quan hệ phức tạp hơn. Một ví dụ là từ điển cho phép bạn lưu trữ các biến và truy cập chúng bằng khóa .

Một giá trị từ điển có thể là một biến?

Biến từ điển là tập hợp các cặp khóa-giá trị, trong đó mỗi khóa được ánh xạ tới một giá trị .

Chủ Đề