我有一个函数,它接受一个字符串,一个字符串数组和一个指针数组,并在字符串数组中查找字符串,并从指针数组中返回相应的指针.因为我将它用于几个不同的东西,指针数组被声明为(void*)的数组,并且调用者应该知道实际上有什么类型的指针(因此它返回的返回值是什么类型的指针) ).
但是,当我传入一个函数指针数组时,在编译时会收到警告-Wpedantic:
铛:
test.c:40:8: warning: assigning to 'voidfunc' (aka 'void (*)(void)') from 'void *' converts
between void pointer and function pointer [-Wpedantic]
Run Code Online (Sandbox Code Playgroud)
GCC:
test.c:40:8: warning: ISO C forbids assignment between function pointer and ‘void *’ [-Wpedantic]
fptr = find_ptr("quux", name_list, (void **)ptr_list,
Run Code Online (Sandbox Code Playgroud)
这是一个测试文件,尽管警告确实正确打印"quux":
#include <stdio.h>
#include <string.h>
void foo(void)
{
puts("foo");
}
void bar(void)
{
puts("bar");
}
void quux(void)
{
puts("quux");
}
typedef void (* voidfunc)(void);
voidfunc ptr_list[] = {foo, bar, quux};
char *name_list[] = {"foo", "bar", …Run Code Online (Sandbox Code Playgroud) 我有一个简单的网页,即:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>History hacks</title>
<script>
window.onpopstate = function (e) {
alert("location: " + document.location + ", state: " + JSON.stringify(e.state));
}
window.onload = function (e) {
alert('page loaded');
}
</script>
</head>
<body>
<p> <a href="http://www.yahoo.com">Yahoo</a> <a href="#part1">Part 1</a></p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
现在关于Chrome和Firefox如何触发popstate事件有很多不同之处(当我开始测试IE时,我不禁想到我正在反对的事情),但是在这里给我带来问题的是Chrome会触发一个popstate只要我点击这两个链接中的任何一个,然后当我点击后退按钮时再次发生事件.Firefox将触发更改散列部分的链接事件(仅在哈希链接相同时才第一次),如果单击Yahoo链接然后单击后退按钮,则根本不会触发它.
那么有一种方法我可以在Firefox中告诉用户刚刚点击回来并从另一个域上的完全不同的站点返回我的页面吗?还有另一个可以在Firefox中用于此目的的事件吗?(当我从yahoo.com返回时,加载事件不会被触发.)
我创建了一个定义该__prepare__方法的元类,该方法应该使用类定义中的特定关键字,如下所示:
class M(type):
@classmethod
def __prepare__(metaclass, name, bases, **kwds):
print('in M.__prepare__:')
print(f' {metaclass=}\n {name=}\n'
f' {bases=}\n {kwds=}\n {id(kwds)=}')
if 'for_prepare' not in kwds:
return super().__prepare__(name, bases, **kwds)
arg = kwds.pop('for_prepare')
print(f' arg popped for prepare: {arg}')
print(f' end of prepare: {kwds=} {id(kwds)=}')
return super().__prepare__(name, bases, **kwds)
def __new__(metaclass, name, bases, ns, **kwds):
print('in M.__new__:')
print(f' {metaclass=}\n {name=}\n'
f' {bases=}\n {ns=}\n {kwds=}\n {id(kwds)=}')
return super().__new__(metaclass, name, bases, ns, **kwds)
class A(metaclass=M, for_prepare='xyz'):
pass
Run Code Online (Sandbox Code Playgroud)
当我运行它时,for_prepare类 A 定义中的关键字参数重新出现在__new__ …
Python 标准库multiprocessing.Event被明确声明为克隆threading.Event并具有相同的接口。我想注释变量和参数,以便它们可以接受这些类中的任何一个,并对mypy它们进行类型检查。我尝试创建一个协议(我使用了它,multiprocessing.synchronize.Event因为这是由 返回的实际类multiprocessing.Event)。
import multiprocessing
import threading
from typing import Optional, Type, Protocol
class Event(Protocol):
def wait(self, timeout: Optional[float]) -> bool:
...
def set(self) -> None:
...
def clear(self) -> None:
...
def is_set(self) -> bool:
...
class Base:
flag_class: Type[Event]
def foo(self, e: Event):
pass
class DerivedOne(Base):
flag_class = multiprocessing.synchronize.Event
def foo(self, e: multiprocessing.synchronize.Event):
pass
class DerivedTwo(Base):
flag_class = threading.Event
def foo(self, e: threading.Event):
pass
Run Code Online (Sandbox Code Playgroud)
然而,mypy(版本 0.761)无法识别这一点 …
python ×2
c ×1
firefox ×1
javascript ×1
metaclass ×1
mypy ×1
pointers ×1
popstate ×1
python-3.x ×1
type-hinting ×1