- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景:假设我们有一个打开常用数据库连接的函数,其本质上类似于以下内容,但具有附加功能:
import getpass
import MySQLdb
def myspecialconnect(user='foo', host='bar', port=80085):
password = getpass.getpassword('Enter your password: ')
return MySQLdb.connect(user, password, host, port)
也许有时,我们想打开两个连接,类似于:
read_connection = myspecialconnect()
write_connection = myspecialconnect()
多么痛苦 - 我必须输入密码两次,而我想要的只是再次输入相同的内容。当然,有很多方法可以修改这个示例以避免这种情况 - 例如,可以添加一个参数,例如 myspecialconnect(multi=True) 来返回两个连接一个,或者如果你想疯狂的话,使用 myspecialconnect(copies=9)
,使用相应的代码在这个函数中实现这一点。然而,这种特殊情况促使我想知道是否有更通用的应用程序。
问题:如果我希望能够从任意函数获取此功能(返回我们想要的任何内容的多个副本)怎么办?嗯 - 这可能很棘手。
首先,为了确认它不起作用,我尝试了以下方法:
def doubled(function):
def Wrapper(*args, **kwargs):
return (function(*args, **kwargs),function(*args, **kwargs))
return Wrapper
对于不需要用户输入的函数来说这是可以的;否则,你仍然需要坐在那里连续输入两次完全相同的内容。这很容易修复,但现在您可能能够看到问题所在:
def doubled(function):
def Wrapper(*args, **kwargs):
result = function(*args, **kwargs)
return (result, result)
return Wrapper
这个版本只接受用户输入一次,但它返回相同的引用两次,这使得它只不过是一种不必要的复杂方式来执行foo = bar = object()
。 “啊哈!”我说,“也许我应该看看 copy
模块。”这就是我所做的,只是我不太知道它是如何工作的......
>>> import copy
>>> a = (i for i in [1,2])
>>> a
<generator object <genexpr> at 0x03FB0878>
>>> copy.copy(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\WinPython-32bit-2.7.5.1\python-2.7.5\lib\copy.py", line 96, in copy
return _reconstruct(x, rv, 0)
File "C:\WinPython-32bit-2.7.5.1\python-2.7.5\lib\copy.py", line 329, in _reconstruct
y = callable(*args)
File "C:\WinPython-32bit-2.7.5.1\python-2.7.5\lib\copy_reg.py", line 93, in __newobj__
return cls.__new__(cls, *args)
TypeError: object.__new__(generator) is not safe, use generator.__new__()
>>> copy.deepcopy(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\WinPython-32bit-2.7.5.1\python-2.7.5\lib\copy.py", line 190, in deepcopy
y = _reconstruct(x, rv, 1, memo)
File "C:\WinPython-32bit-2.7.5.1\python-2.7.5\lib\copy.py", line 329, in _reconstruct
y = callable(*args)
File "C:\WinPython-32bit-2.7.5.1\python-2.7.5\lib\copy_reg.py", line 93, in __newobj__
return cls.__new__(cls, *args)
TypeError: object.__new__(generator) is not safe, use generator.__new__()
当然,到目前为止,我已经在这个小问题上花费了尽可能多的时间(或更多),这意味着我非常好奇。是否可以通过返回任意实例的副本的方式来完成此操作,而不会变成被迫显式处理数十个案例的怪物,每个案例都以自己的特殊方式?
最佳答案
没有通用的方法可以做你想做的事。如果您只想重播第一个函数调用,那会很简单 - 您的第一次尝试就会成功。不幸的是,重放用户输入的要求使事情变得复杂。
首先,您不需要副本。如何复制数据库连接?网络连接的另一端有您必须复制的状态,并且您必须选择新端口,并且从具有相同状态和属性的意义上来说,它最终不会真正成为副本。您想要使用与旧连接相同的参数打开一个新连接。
其次,装饰器无法知道要重播哪些输入。使用相同的参数调用一个函数两次很容易。调用一个函数两次,将用户的输入从第一次调用重播到第二次调用,虽然很困惑,但也是可能的。但是,如果装饰器尝试将第一次调用的所有输入重播到第二次调用,那么它最终也会重播数据库的 TCP 响应。第二次调用不会与数据库通信并建立连接,而是与装饰器通信并返回一个不起作用的连接对象。
不要尝试加倍 myspecialconnect
,而是创建一个不需要读取用户输入的函数并将其加倍。读取密码一次,然后将其传递到双倍函数中。
关于python - 通用函数/对象加倍装饰器在 Python 中是否可行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17751480/
我有一个 if 语句,如下所示 if (not(fullpath.lower().endswith(".pdf")) or not (fullpath.lower().endswith(tup
然而,在 PHP 中,可以: only appears if $foo is true. only appears if $foo is false. 在 Javascript 中,能否在一个脚
XML有很多好处。它既是机器可读的,也是人类可读的,它具有标准化的格式,并且用途广泛。 它也有一些缺点。它是冗长的,不是传输大量数据的非常有效的方法。 XML最有用的方面之一是模式语言。使用模式,您可
由于长期使用 SQL2000,我并没有真正深入了解公用表表达式。 我给出的答案here (#4025380)和 here (#4018793)违背了潮流,因为他们没有使用 CTE。 我很欣赏它们对于递
我有一个应用程序: void deleteObj(id){ MyObj obj = getObjById(id); if (obj == null) { throw n
我的代码如下。可能我以类似的方式多次使用它,即简单地说,我正在以这种方式管理 session 和事务: List users= null; try{ sess
在开发J2EE Web应用程序时,我通常会按以下方式组织我的包结构 com.jameselsey.. 控制器-控制器/操作转到此处 服务-事务服务类,由控制器调用 域-应用程序使用的我的域类/对象 D
这更多是出于好奇而不是任何重要问题,但我只是想知道 memmove 中的以下片段文档: Copying takes place as if an intermediate buffer were us
路径压缩涉及将根指定为路径上每个节点的新父节点——这可能会降低根的等级,并可能降低路径上所有节点的等级。有办法解决这个问题吗?有必要处理这个吗?或者,也许可以将等级视为树高的上限而不是确切的高度? 谢
我有两个类,A 和 B。A 是 B 的父类,我有一个函数接收指向 A 类型类的指针,检查它是否也是 B 类型,如果是将调用另一个函数,该函数接受一个指向类型 B 的类的指针。当函数调用另一个函数时,我
有没有办法让 valgrind 使用多个处理器? 我正在使用 valgrind 的 callgrind 进行一些瓶颈分析,并注意到我的应用程序中的资源使用行为与在 valgrind/callgrind
假设我们要使用 ReaderT [(a,b)]超过 Maybe monad,然后我们想在列表中进行查找。 现在,一个简单且不常见的方法是: 第一种可能性 find a = ReaderT (looku
我的代码似乎有问题。我需要说的是: if ( $('html').attr('lang').val() == 'fr-FR' ) { // do this } else { // do
根据this文章(2018 年 4 月)AKS 在可用性集中运行时能够跨故障域智能放置 Pod,但尚不考虑更新域。很快就会使用更新域将 Pod 放入 AKS 中吗? 最佳答案 当您设置集群时,它已经自
course | section | type comart2 : bsit201 : lec comart2 :
我正在开发自己的 SDK,而这又依赖于某些第 3 方 SDK。例如 - OkHttp。 我应该将 OkHttp 添加到我的 build.gradle 中,还是让我的 SDK 用户包含它?在这种情况下,
随着 Rust 越来越充实,我对它的兴趣开始激起。我喜欢它支持代数数据类型,尤其是那些匹配的事实,但是对其他功能习语有什么想法吗? 例如标准库中是否有标准过滤器/映射/归约函数的集合,更重要的是,您能
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
我一直在研究 PHP 中的对象。我见过的所有示例甚至在它们自己的对象上都使用了对象构造函数。 PHP 会强制您这样做吗?如果是,为什么? 例如: firstname = $firstname;
...比关联数组? 关联数组会占用更多内存吗? $arr = array(1, 1, 1); $arr[10] = 1; $arr[] = 1; // <- index is 11; does the
我是一名优秀的程序员,十分优秀!