- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
Về câu hỏi này 的后续问题: 我在 python 3.5 和 python 3.6 上运行了下面的代码——结果截然不同:
class Container:
KEYS = ('a', 'b', 'c')
def __init__(self, a=None, b=None, c=None):
tự.a = a
self.b = b
self.c = c
def keys(self):
return Container.KEYS
def __getitem__(self, key):
if key not in Container.KEYS:
raise KeyError(key)
return getattr(self, key)
def __str__(self):
# python 3.6
# return f'{self.__class__.__name__}(a={self.a}, b={self.b}, c={self.c})'
# python 3.5
return ('{self.__class__.__name__}(a={self.a}, b={self.b}, '
'c={self.c})').format(self=self)
data0 = Container(a=1, b=2, c=3)
print(data0)
data3 = Container(**data0, b=7)
print(data3)
如前一个问题所述
TypeError: type object got multiple values for keyword argument 'b'
在 python 3.6 上。但是在 python 3.5 上我得到了异常:
KeyError: 0
此外,如果我不引发 KeyError
而只是在 __getitem__
中打印出 chìa khóa
Và trở lại
:
def __getitem__(self, key):
if key not in Container.KEYS:
# raise KeyError(key)
print(key)
trở lại
return getattr(self, key)
这将打印出 số nguyên
序列 0, 1, 2, 3, 4, ...
。 ( python 3.5)
所以我的问题是:
版本之间发生了什么变化,导致其行为如此不同?
这些整数是从哪里来的?
CẬP NHẬT :如 λuser 的评论中所述: 实现 __iter__
将改变 python 3.5 的行为以匹配 python 3.6 的行为:
def __iter__(self):
return iter(Container.KEYS)
câu trả lời hay nhất
这实际上是在解包自定义映射对象和创建调用者参数期间多个内部操作之间的复杂冲突。因此,如果您想彻底了解根本原因,我建议您查看源代码。不过,这里有一些提示和起点,您可以查看这些提示和起点以获取更多详细信息。
在内部,当您在调用者级别解包时,字节码 BUILD_MAP_UNPACK_WITH_CALL(count)
从堆栈中弹出 đếm 个映射,将它们合并到一个字典中并推送结果。另一方面,带有参数 oparg
is defined as following 的操作码的堆栈效果:
case BUILD_MAP_UNPACK_WITH_CALL:
return 1 - oparg;
话虽如此,让我们看一下示例的字节码(在 Python-3.5 中)以了解实际情况:
>>> def bar(data0):foo(**data0, b=4)
...
>>>
>>> dis.dis(bar)
1 0 LOAD_GLOBAL 0 (foo)
3 LOAD_FAST 0 (data0)
6 LOAD_CONST 1 ('b')
9 LOAD_CONST 2 (4)
12 BUILD_MAP 1
15 BUILD_MAP_UNPACK_WITH_CALL 258
18 CALL_FUNCTION_KW 0 (0 positional, 0 keyword pair)
21 POP_TOP
22 LOAD_CONST 0 (None)
25 RETURN_VALUE
>>>
如您所见,在偏移量 15 处,我们有 BUILD_MAP_UNPACK_WITH_CALL
负责解包的字节代码。
现在它返回 0 作为 __getitem__
方法的 chìa khóa
参数会发生什么?
每当解释器在解包过程中遇到异常时,在本例中是 KeyError
,它会停止继续推/弹出流程,而不是返回变量的实际值,而是返回堆栈效果这就是为什么键一开始是 0 的原因,如果您每次获得递增的结果时都没有处理异常(由于堆栈大小)。
现在,如果您在 Python-3.6 中执行相同的反汇编,您将得到以下结果:
>>> dis.dis(bar)
1 0 LOAD_GLOBAL 0 (foo)
2 BUILD_TUPLE 0
4 LOAD_FAST 0 (data0)
6 LOAD_CONST 1 ('b')
8 LOAD_CONST 2 (4)
10 BUILD_MAP 1
12 BUILD_MAP_UNPACK_WITH_CALL 2
14 CALL_FUNCTION_EX 1
16 POP_TOP
18 LOAD_CONST 0 (None)
20 RETURN_VALUE
在创建局部变量 (LOAD_FAST
) 之前和在 LOAD_GLOBAL
之后有一个 BUILD_TUPLE
它负责创建一个元组并从堆栈中消耗计数项。
BUILD_TUPLE(count)
Creates a tuple consuming count items from the stack, and pushes the >resulting tuple onto the stack.
在我看来,这就是为什么您没有收到关键错误而是收到 LoạiLỗi
的原因。因为在创建参数元组期间它遇到了重复的名称,因此正确地返回了 LoạiLỗi
。
关于python - 就地自定义对象使用 __getitem__ python 3.5 与 python 3.6 解包不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50384549/
Tôi muốn vẽ một hình elip bằng cách quét đường thẳng để tìm giá trị của y cho mỗi giá trị của x. Đối với một hình elip bình thường, công thức rất dễ tìm: y = Sqrt[b^2 - (b^2 x^2)/a^2] Nhưng tôi chưa thể tìm ra cách tính y khi trục của hình elip được quay
Giả sử tôi có ma trận này: 1 1 1 | 1 Hệ thống này rõ ràng có nghiệm vô hạn. x1 = -x2 x3 = 1 x1 phụ thuộc vào x2, x2 là miễn phí, nhưng tôi quan tâm đến x3. Có thuật toán nào có thể
Tôi đang nghĩ đến việc sử dụng mạng thần kinh để cung cấp năng lượng cho kẻ thù của mình trong game bắn súng không gian mà tôi đang chế tạo và tôi đang tự hỏi làm cách nào để huấn luyện mạng thần kinh khi mạng không có một bộ đầu ra tốt rõ ràng? Câu trả lời hay nhất Tôi hiện đang làm việc trên mạng thần kinh và không có đầu vào và đầu ra được xác định rõ ràng
Tôi cần một quy trình giải nén nhanh được tối ưu hóa cho môi trường tài nguyên bị hạn chế, chẳng hạn như hệ thống nhúng nhị phân (dữ liệu hex) với các đặc điểm sau: Dữ liệu được định hướng 8 bit (byte) (bus dữ liệu rộng 8 bit). Phạm vi giá trị byte không đồng đều 0 - 0xFF
Mã PHP: $txt="John có mèo và chó."; //văn bản thuần túy $txt=base64_encode($txt); //mã hóa base64 $txt=gzd
Chương trình nhận được một số dương k từ người dùng và sẽ kiểm tra xem phương trình có bao nhiêu nghiệm 3*x+5*y=k Trong trường hợp có nhiều nghiệm thì hàm sẽ lấy giá trị tuyệt đối lớn hơn của |xy| trong số tất cả các nghiệm . Nếu chỉ có một giải pháp, nó sẽ in nó. Ví dụ: nếu
Tôi phải giải phương trình vi phân sau: Hoặc mã đơn giản không có số hạng F_1. Nhưng tôi không thể giải quyết nó bằng cách đưa vào thuật ngữ F_1, mặc dù tôi biết giải pháp sẽ giống như một sự cộng hưởng tắt dần. từ nhập scipy.integrate
Tôi biết câu hỏi này là một biến thể của tổng tiền tố, tôi chỉ gặp một số khó khăn khi thiết lập nó. Định nghĩa câu trả lời hay nhất: P[i] = A[i+1] + A[i+2] + ... + A[n] Q[i] = A[1] + ... + A[i
Trong nhiều ví dụ trực tuyến, các tệp được (giải) nén trong Java bằng cách sử dụng bộ đệm mã hóa. Tuy nhiên, với NIO, không cần phải chọn kích thước bộ đệm tốt. Tôi đã tìm thấy các ví dụ về tệp và ổ cắm, nhưng có kênh NIO cho đầu vào nén không (ví dụ:
Tôi có hệ phương trình có dạng A*x = B, trong đó [A] là ma trận hệ số ba đường chéo. Sử dụng bộ giải Numpy numpy.linalg.solve tôi có thể giải hệ phương trình cho x. Xem ví dụ bên dưới để biết cách tôi mở
Tôi đã cố gắng trả lời câu hỏi này chỉ bằng cách sử dụng đệ quy (lập trình động) http://en.wikipedia.org/wiki/Longest_increasing_subsequence Từ bài viết này, tôi nhận ra giải pháp hiện có hiệu quả nhất
Giải pháp cho vấn đề này là thêm DLL vào GAC theo một trong những gợi ý trong bài đăng của tôi. Như tôi đã chỉ ra trong một trong những câu trả lời của mình, khả năng mở rộng sẽ không khả dụng trong các môi trường mà quy trình này cần được chạy. Vì vậy, không thể chọn giải pháp đơn giản. Để giải quyết vấn đề này, tôi
Có thông số kỹ thuật nào mô tả cụ thể tiêu chuẩn AAC-LC không và các mục tiêu thực tế để triển khai một codec không phải là codec phổ quát mà dành cho định dạng AAC-LC cụ thể, với số lượng kênh và tốc độ lấy mẫu được xác định trước là gì? Có cái nào dành cho AAC-LC không?
Tôi muốn sử dụng "p" chung để xác định số lượng đầu ra mà bộ ghép kênh sẽ có. Đầu vào và tất cả đầu ra là 1 bit. Đầu ra, điều khiển và đầu vào có thể đơn giản như: điều khiển tín hiệu: std_logic_vector(log 2 p
Tôi đang cố gắng sử dụng một số hàm Angular trong javascript để định vị một số div kim cương, nhưng có vẻ như logic của tôi bị lỗi ở đâu đó. Bạn có thể thấy tôi đã thử công thức này: pos + trig * Dimension. TÔI
đóng cửa. Câu hỏi này cần tập trung hơn. Hiện tại nó không chấp nhận câu trả lời. Bạn muốn cải thiện câu hỏi này? Đã cập nhật câu hỏi để tập trung vào một vấn đề chỉnh sửa bài đăng này. Đã đóng 4 năm trước. Cải thiện câu hỏi này
Tôi đang xem xét hai thư viện JSON này: Google Gson JSON.Simple XStream Google Gson rất tuyệt, nó có thể tuần tự hóa các đối tượng lớp bằng các hàm tạo không có đối số. JSON.Simple rất đơn giản,
Giải pháp ODE số để phù hợp với dữ liệu bằng Gekko. Xin chào mọi người! Tôi muốn biết liệu có thể điều chỉnh các hệ số của ODE bằng GEKKO hay không. Nỗ lực của tôi để sao chép ví dụ được đưa ra ở đây đã thất bại. Đây là những gì tôi nghĩ ra (nhưng có sai sót).
Như chúng ta đã biết, ASCII sử dụng 7 bit để mã hóa các ký tự nên số byte dùng để biểu thị văn bản luôn nhỏ hơn độ dài của các chữ cái trong văn bản.
Tôi đã tìm thấy một liên kết hiển thị một ví dụ trong đó toán tử Matlab mldivide (\) đưa ra các giải pháp "đặc biệt" khi một hệ phương trình tuyến tính có vô số nghiệm. Ví dụ: A = [1 2 0;
Tôi là một lập trình viên xuất sắc, rất giỏi!