我想定义适用于 的map
和min
/ max
(最初在 中定义sequtils
)的重载tables.keys
。具体来说,我希望能够写出如下内容:
import sequtils, sugar, tables
# A mapping from coordinates (x, y) to values.
var locations = initTable[(int, int), int]()
# Put in some random values.
locations[(1, 2)] = 1
locations[(2, 1)] = 2
locations[(-2, 5)] = 3
# Get the minimum X coordinate.
let minX = locations.keys.map(xy => xy[0]).min
echo minX
Run Code Online (Sandbox Code Playgroud)
现在失败了:
/usercode/in.nim(12, 24) Error: type mismatch: got <iterable[lent (int, int)], proc (xy: GenericParam): untyped>
but expected …
Run Code Online (Sandbox Code Playgroud) 我知道这可能是糟糕的设计,但我遇到了一种情况,我需要动态创建Derived
类的子类,并使实例失败或检查(即 return )。Base
Derived
issubclass(Derived, Base)
isinstance(derived_obj, Base)
False
我尝试了多种方法,但没有成功:
__class__
( Derived
/sf/answers/3007060941/ )的属性。这只能用于使支票退回True
。__instancecheck__
和__subclasscheck__
方法Base
。这不起作用,因为 CPython 仅在常规检查返回时调用这些方法False
。__class__
在 期间分配属性__init__
。Python 3.6+ 中不再允许这样做。Derived
子类object
并将其所有属性和方法(包括特殊方法)分配给Base
. 这不起作用,因为某些方法(例如__init__
)不能在不是 的子类的实例上调用Base
。这可以用 Python 完成吗?该方法可以是特定于解释器的(代码仅在 CPython 中运行),并且只需要针对 Python 版本 3.6+。
为了说明此要求的潜在用途,请考虑以下函数:
def map_structure(fn, obj):
if isinstance(obj, list):
return [map_structure(fn, x) for x in obj]
if isinstance(obj, dict):
return …
Run Code Online (Sandbox Code Playgroud)