编辑注释 1:到目前为止,我发现PEP 612解决了这个问题 - 从 Python 3.10 开始 - 通过引入typing.ParamSpec. 所以这个问题专门针对 Python 3.9 或更早版本。
编辑注释 2:原始示例过于狭窄,因为它的返回类型与参数类型完全匹配,但问题实际上是关于更通用的情况,其中函数的参数签名相同,但返回类型相同是不同的。(也欢迎允许不同参数签名的更通用的解决方案。)
问题:我正在使用一个转换函数,它接收一个函数作为参数,并返回另一个函数作为其结果。传递的函数可以有任意数量和类型的参数(为简单起见,我们可以坚持位置参数),返回的函数以与原始函数相同的方式调用(具有相同数量和类型的参数),并有一个返回值type 取决于传递函数的返回类型(但不一定等于它;例如,它可以是包含原始返回类型的值和某个给定类型的另一个值的元组)。
如何以反映传递和返回函数的签名依赖性的方式注释转换函数?
一个简单的例子:
from typing import Callable
def transform(original_function: Callable) -> Callable:
def new_function(*args):
extra_payload = <do some calculation>
return original_function(*args), extra_payload
return new_function
def f(x: int, s: str) -> bool:
...
f(3, 'abc') # this is a valid call
f('abc', 3) # PyCharm warns about wrong argument types
# The goal is to have a …Run Code Online (Sandbox Code Playgroud) python annotations type-hinting higher-order-functions python-typing
我有一个unicode字符串,我想写入一个文件.
在Python 2中我可以写:
open('filename', 'w').write(s.encode('utf-8'))
Run Code Online (Sandbox Code Playgroud)
但是这对于Python 3来说是失败的.显然,s.encode()返回类型为'bytes'的东西,write()函数不接受:
TypeError: must be str, not bytes
Run Code Online (Sandbox Code Playgroud)
有谁知道如何将上述代码移植到Python 3?
编辑:
感谢所有建议使用二进制模式的人!不幸的是,这会导致\n字符出现问题.有没有办法实现与Python 2相同的结果(即在UTF-8中编码非ANSI字符,同时保持\n的特定于操作系统的再现)?
谢谢!
在我的 HTML 页面上有一个元素,上面有一些文本。我指定了单击该元素时要发生的操作。当用户连续多次点击元素时,有时会发生双击,导致文本被选中(突出显示),从而损坏外观。我尝试使用虚拟事件处理程序来阻止它,该处理程序可阻止双击 (dblclick) 事件的默认行为。然而,这似乎不起作用。似乎在执行我的虚拟事件处理程序之前,文本已被选择并突出显示。
function doNothing(event) {
alert('doNothing'); // Added for debugging. The alert is shown, meaning the event handler is invoked. When I get the alert, the text is already highlighted.
if(!event) event = window.event;
if(event.preventDefault) event.preventDefault();
event.cancelBubble = true;
if(event.stopPropagation) event.stopPropagation();
return false;
}
myElem.onlick = doSomething; // This is the event for a single click. Works well.
myElem.ondblclick = doNothing; // The event handler is called, but the text is already highlighted.
Run Code Online (Sandbox Code Playgroud)
具体问题:
1)我所追求的与双击事件有任何关系吗?(正如我看到的,当警报响起时,文本已经突出显示,我怀疑这可能是另一种机制。我怀疑(单击)事件的默认行为可能与它有关,但我取消了默认行为(单次)点击事件也是如此。)
2)如果它与 dblclick …
(我对Scala还是陌生的,希望这不是一个愚蠢的问题。)
据我所知,为函数声明参数implicit有两种(相关但完全不同)的用法:
当编译器可以找到唯一合适的值(在调用范围内)传递时,它使在调用给定函数时显式地传递相应的参数成为可选操作。
它使参数本身成为传递给具有隐式参数的其他函数的合适值(当从给定函数中调用它们时)。
在代码中:
def someFunction(implicit someParameter: SomeClass) = { // Note `implicit`
...
// Note no argument supplied in following call;
// possible thanks to the combination of
// `implicit` in `someOtherFunction` (1) and
// `implicit` in line 1 above (2)
someOtherFunction
...
}
def someOtherFunction(implicit someOtherParameter: SomeClass) = {
...
}
implicit val someValue = new SomeClass(...)
// Note no argument supplied in following call; …Run Code Online (Sandbox Code Playgroud) 我正在用 Kotlin/JS 编写一个浏览器应用程序,并使用kotlinx.htmlDSL 来生成一些 HTML。对于(一个简单的)例子:
(window.document.body!! as Node).append {\n p {\n +"Some text"\n }\n p {\n +"Click here"\n onClickFunction = { event ->\n <Do some stuff here...>\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n现在我的问题是我希望能够引用此代码创建的元素。例如,假设当用户单击第二个p元素(其中有一个单击事件处理程序)时,我想对第一个元素执行某些操作p(例如更改其文本)。有没有一种优雅的方法来做到这一点?
我知道我可以以某种方式找到该元素(例如,通过给它一个 ID,然后查找它,或者依靠它的位置或其他东西),并且我可以在事件处理程序中执行此操作,或者如果我愿意,可以在某些中执行此操作其他代码将在创建元素后运行 \xe2\x80\x93 但仍作为初始化 \xe2\x80\x93 的一部分,并将在事件处理程序随后可以使用的某个变量中保存对该元素的引用。但是,当我的代码在那里定义该元素时,做类似的事情感觉像是一种解决方法,因此我正在寻找一种方法来获取对该元素的引用,作为构建它的过程的一部分(如果可能的话)。
\n我正在使用Python Bottle运行服务器.它工作得非常好,但是它会将它处理的每个请求记录到控制台,这会减慢它的速度.有没有办法指示它不要将这些日志发送到控制台?
示例代码:
from bottle import route, run
@route('/')
def index():
return 'Hello, world!'
run(host = 'localhost', port = 8080)
Run Code Online (Sandbox Code Playgroud)
示例输出(每次发出请求时都会得到localhost:8080/):
127.0.0.1 - - [06/Jun/2015 11:23:24] "GET / HTTP/1.1" 200 244
Run Code Online (Sandbox Code Playgroud) 可能重复:
如何检测函数是否被调用为构造函数?
我希望在JavaScript中有一个函数,如果它被正常调用或者为了创建一个新实例而调用它,它的行为会有所不同.可能存在许多不同的用途,其中两个功能可以相关或不相关.new当函数总是用于创建新实例时,一种用途是免除编码器必须键入:
function MyClass(arg1, arg2) {
if(/* not called with "new" */) return new MyClass(arg1, arg2);
// instance initialization stuff here...
}
Run Code Online (Sandbox Code Playgroud)
这样我就不必输入var x = new MyClass(arg1, arg2):输入就足够了var x = MyClass(arg1, arg2)(但前者也不会错).
只是可能使用的一个例子.
可以这样做吗?如果是这样,怎么样?
我想做这样的事情:
var elem = document.createElement("input");
elem.setAttribute("my-attribute", myObject);
document.getElementById("parent").appendChild(elem);
Run Code Online (Sandbox Code Playgroud)
稍后我将需要myObject在对此(和类似)元素执行某些操作时获取.
注意:我需要将它作为一个属性(例如,不作为元素对象的成员,如同elem.myAttribute = myObject),对于某些元素,值是一个硬编码到页面HTML中的字符串.我需要的是能够以编程方式为其他元素设置此属性,并使用并非总是纯字符串的值.
我试过这个并且它在我的浏览器(Firefox 14)中工作,但是我需要知道这是否适用于跨浏览器,以及如果我决定使用jQuery,我将能够使用jQuery获取这些属性的值我的页面稍后.
javascript ×3
python ×2
annotations ×1
attributes ×1
bottle ×1
dom ×1
implicit ×1
kotlin-js ×1
kotlinx-html ×1
python-3.x ×1
scala ×1
type-hinting ×1
unicode ×1