我大量使用 python 3 中的 python 类型支持。
最近我试图将一个函数作为参数传递,但kwargs在typing.Callable签名中找不到任何帮助。
请检查下面的代码和评论。
import typing
# some function with singnature typing
def fn1_as_arg_with_kwargs(a: int, b: float) -> float:
    return a + b
# some function with singnature typing
def fn2_as_arg_with_kwargs(a: int, b: float) -> float:
    return a * b
# function that get callables as arg
# this works with typing
def function_executor(
        a: int, 
        b: float, 
        fn: typing.Callable[[int, float], float]):
    return fn(a, b)
# But what if I want to …Run Code Online (Sandbox Code Playgroud) 我想在使用带有abc库的抽象类时提取 python 类名。不幸的是,我收到了 class name ABCMeta。
import abc
class A(abc.ABC)
    pass
class B(A)
    pass
print(A.__class__.__name__)  # output: 'ABCMeta'
print(B.__class__.__name__)  # output: 'ABCMeta'
print(str(A))  # output: "<class '__main__.A'>"
print(str(B))  # output: "<class '__main__.B'>"
Run Code Online (Sandbox Code Playgroud)
我希望我应该收到如下输出
print(A.__class__.__name__)  # output: 'A'
print(B.__class__.__name__)  # output: 'B'
Run Code Online (Sandbox Code Playgroud)
在str(A)和str(B)似乎让我假设类的名字可以从什么地方提取打印的类名。但尽管如此,我对str用来解析和获取类名不感兴趣。
假设数据是1011 1001掩码0111 0110,那么你有:
input data:       1011 1001
input mask:       0111 0110
apply mask:       0011 0000 (based on `input mask`)
bits selected:    -011 -00- (based on `input mask`)
right packed:     ---0 1100
expected result:  0000 1100 (set left `8 - popcount('input mask')` bits to zero) 
Run Code Online (Sandbox Code Playgroud)
所以最终的输出是0000 1100(注意左边的3个未指定的位置是零填充的).
您可以看到,只要屏蔽位为1,input mask就会选择相应的值(在input data上面),然后所有选中的位在结果的最低有效位中连续打包(如上所示bits selected).最后,在打包后留下的任何最左边的位被设置为0(将存在right packed这样的位).
明显的选择是旋转和选择,但这将消耗5个操作,因为掩码有5位.我可以一步完成吗?
注意:
掩码可以是任意8 - popcount(mask)位的任何东西n(在上面的例子中ON).您所知道的是 …
请检查下面的代码
import typing
import abc
class A(abc.ABC):
    @abc.abstractmethod
    def f(self) -> typing.NamedTuple[typing.Union[int, str], ...]:
        ...
class NT(typing.NamedTuple):
    a: int
    b: str
class B(A):
    def f(self) -> NT:
        return NT(1, "s")
print(B().f())
Run Code Online (Sandbox Code Playgroud)
我收到一个错误。在父类中A,我想定义方法f,以便指示任何子类都应该通过返回仅由ot字段NamedTuple组成的a 来覆盖它。intstr
但我收到一条错误消息:
TypeError: 'NamedTupleMeta' object is not subscriptable
Run Code Online (Sandbox Code Playgroud)
如下更改签名会有所帮助,但是我如何告诉打字系统子类可以返回仅包含 int 和 str 的 NamedTuples
TypeError: 'NamedTupleMeta' object is not subscriptable
Run Code Online (Sandbox Code Playgroud)