谁能告诉我为什么这不起作用?
>>> import mock
>>> @mock.patch('datetime.date.today')
... def today(cls):
... return date(2010, 1, 1)
...
>>> from datetime import date
>>> date.today()
datetime.date(2010, 12, 19)
Run Code Online (Sandbox Code Playgroud)
也许有人可以建议一个更好的方法?
对另一个Stack Overflow问题的评论指出,Python就像Ruby一样,因为它与"一切都是对象"有关,而Python中的所有内容都是一个对象,就像Ruby一样.
这是真的?像ruby一样,python中的所有东西都是对象吗?
两者在这方面有何不同,或者它们是否真的相同?例如,你可以拿一个号码来做我看过的红宝石:
y = 5.plus 6
Run Code Online (Sandbox Code Playgroud)
可以在Python中以相同的方式完成吗?
是否可以为python内置类型添加扩展方法?我知道我可以通过简单地添加新方法来将扩展方法添加到已定义的类型.如下:
class myClass:
pass
myClass.myExtensionMethod = lambda self,x:x * 2
z = myClass()
print z.myExtensionMethod(10)
Run Code Online (Sandbox Code Playgroud)
但是有没有办法将扩展方法添加到python built'in类型,如list,dict,...
list.myExtension = lambda self,x:x * 2
list.myExtension(10)
Run Code Online (Sandbox Code Playgroud) 如何在python中扩展内置类?我想在str类中添加一个方法.
我已经做了一些搜索,但我发现的都是较旧的帖子,我希望有人知道更新的东西.
这是更普遍的问题,然后是语言特定的,虽然我在使用python ncurses模块时碰到了这个问题.我需要显示区域设置字符并将它们识别为字符,所以我很快就从curses模块中修补了一些函数/方法.
这就是我称之为快速而丑陋的解决方案,即使它有效.而且变化相对较小,所以我希望我没有搞砸任何东西.我的计划是找到另一个解决方案,但看到它的工作和运作良好,你知道它是怎么回事,我继续处理我必须处理的其他问题,我敢肯定,如果没有这个问题,我将永远不会让它更好.
然而,更普遍的问题出现在我面前 - 显然有些语言允许我们在类中修补大块代码.如果这是我自己只使用的代码,或者变化很小,那就没关系.如果其他开发人员接受我的代码会怎样,他看到我使用了一些众所周知的模块,所以他可以认为它可以像以前一样工作.然后,这种方法突然表现得与之不同.
所以,非常主观,我们应该使用猴子补丁,如果是,何时以及如何?我们该怎么记录它?
编辑:for @guerda:
Monkey-patching是在执行时动态地改变某些代码片段的行为的能力,而不需要改变代码本身.
Python中的一个小例子:
import os
def ld(name):
print("The directory won't be listed here, it's a feature!")
os.listdir = ld
# now what happens if we call os.listdir("/home/")?
os.listdir("/home/")
Run Code Online (Sandbox Code Playgroud) 我是一个C#dev进入一些Python的东西,所以我不知道我现在在做什么.我已经读过你不需要使用Python的依赖注入.我被告知你可以在代码中实例化对象并让它们以你想要的方式运行,但是,你可以将这些对象上的方法指向我自己的测试中定义的存根 - 据说没有模拟.
这是真的?我试过这样做,并不能让它工作.这实际上是怎么做到的?如何在没有模拟库的情况下在Python中存根方法?
出于特定的调试目的,我想包装任意对象的del函数来执行额外的任务,比如将对象的最后一个值写入文件.
理想情况下,我想编写monkey(x),它应该意味着删除x时会打印x的最终值
现在我认为del是一个类方法.所以以下是一个开始:
class Test:
def __str__(self):
return "Test"
def p(self):
print(str(self))
def monkey(x):
x.__class__.__del__=p
a=Test()
monkey(a)
del a
Run Code Online (Sandbox Code Playgroud)
但是,如果我想要特定的对象,我想我需要动态地将它们的类重写为一个新的?此外我还需要这样做,因为我无法访问内置类型的del?
谁知道如何实现?
我试图使我的一些代码Python 2和3兼容.
目前,我与像功能挣扎range/ xrange等方法dict.items/ dict.iteritems.理想情况下,我希望我的代码能够在Python 3.x中使用前者,在Python 2.x中使用后者.
使用if/ else在我看来是实现这个的最简单的方法:
if py >= 3:
for item in array.items()
...
else:
for item in array.iteritems()
Run Code Online (Sandbox Code Playgroud)
但是,这样做会导致大量重复和丑陋的代码.有没有更好的方法只使用标准库?我可以在代码开头的某个地方说明总是使用range/ dict.itemsif py >= 3和xrange/ dict.iteritems如果没有?
可以这样做吗?
if py < 3:
use xrange as range
Run Code Online (Sandbox Code Playgroud)
我环顾四周,我知道有几个库,比如六个未来化的库,用于解决这个问题.但是我正在使用只运行python 2.7的服务器,我不允许在其上安装任何额外的库.我有一些我想使用的python3代码,但我也想只维护一个版本的代码.
我有一个大型项目,在各个地方有问题的隐式Unicode转换(coersions)以例如:
someDynamicStr = "bar" # could come from various sources
# works
u"foo" + someDynamicStr
u"foo{}".format(someDynamicStr)
someDynamicStr = "\xff" # uh-oh
# raises UnicodeDecodeError
u"foo" + someDynamicStr
u"foo{}".format(someDynamicStr)
Run Code Online (Sandbox Code Playgroud)
(也可能是其他形式.)
现在我想跟踪这些用法,特别是那些积极使用的代码.
如果我可以轻松地unicode用一个包装器替换构造函数会很好,它会检查输入是否为type str并且encoding/ errorsparameters设置为默认值然后通知我(打印回溯等).
/编辑:
虽然没有直接关系的东西我找我碰到了如何使解码异常干脆离开这个光荣可怕的黑客(解码一个唯一的,即str到unicode,而不是周围的其他方法,请参阅https://开头的邮件. python.org/pipermail/python-list/2012-July/627506.html).
我不打算使用它,但对于那些与无效的Unicode输入和寻找快速修复(但请考虑副作用)的问题进行斗争可能会很有趣:
import codecs
codecs.register_error("strict", codecs.ignore_errors)
codecs.register_error("strict", lambda x: (u"", x.end)) # alternatively
Run Code Online (Sandbox Code Playgroud)
(互联网搜索codecs.register_error("strict"显示它显然用于某些真实项目.)
/编辑#2:
对于显式转换,我在monkeypatching的SO帖子的帮助下制作了一个片段:
class PatchedUnicode(unicode):
def __init__(self, obj=None, encoding=None, *args, **kwargs):
if encoding in (None, "ascii", …Run Code Online (Sandbox Code Playgroud) 我可以动态地将属性添加到新式类的实例(派生自的类object)吗?
细节:
我正在使用sqlite3.Connection的一个实例.简单地扩展类不是一个选项,因为我没有通过调用构造函数来获取实例; 我通过电话得到它sqlite3.connect().
构建一个包装器并没有为我正在编写的代码节省大量的工作量.
Python 2.7.1
编辑
正确回答所有.但我仍然没有达到我的目标; sqlite3.Connection栏的实例我尝试以下列方式设置属性(就像它自己的实例一样object).我总是得到一个AttributeError:
> conn = sqlite3.connect([filepath])
> conn.a = 'foo'
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
conn.a = 'foo'
AttributeError: 'object' object has no attribute 'a'
> conn.__setattr__('a','foo')
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
conn.__setattr__('a','foo')
AttributeError: 'object' object has no attribute 'a'
Run Code Online (Sandbox Code Playgroud)
救命?
我试图弄清楚如何使用其他功能增强authenticate方法.
例如
这个网站的前端非常简单,但管理面板呢?
我估计我应该覆盖User的Manager对象,因为authenticate可能存在于那里.我觉得这很难理解.
提前致谢!:)
python django django-models django-admin django-authentication
可以len()在Python 3.6中模拟内置函数吗?
我有一个类,定义了一个简单的方法,该方法依赖于以下len()功能:
class MyLenFunc(object):
def is_longer_than_three_characters(self, some_string):
return len(some_string) > 3
Run Code Online (Sandbox Code Playgroud)
我正在尝试为此方法编写一个单元测试,但是我无法在len()不产生错误的情况下模拟出该函数。这是我到目前为止的内容:
import unittest
from unittest.mock import patch
import my_len_func
class TestMyLenFunc(unittest.TestCase):
@patch('builtins.len')
def test_len_function_is_called(self, mock_len):
# Arrange
test_string = 'four'
# Act
test_object = my_len_func.MyLenFunc()
test_object.is_longer_than_three_characters(test_string)
# Assert
self.assertEqual(1, mock_len.call_count)
if __name__ == '__main__':
unittest.main()
Run Code Online (Sandbox Code Playgroud)
我在这里找到了另一个SO问题/答案,它暗示不可能模拟出内置函数,因为它们是不可变的。但是,我在这里和这里发现了另外两个网站,这表明其他情况。我在上面的单元测试课程中的尝试直接来自这些网站中的后者(是的,我已经尝试了此处提到的其他技术。所有方法都以相同的错误结尾)。
我收到的错误要花很长时间才能发布完整的内容,因此我将剪掉它的重复部分(您将从错误消息的最后一部分中看到它是递归的)。错误文本如下:
ERROR: test_len_function_is_called (__main__.TestMyLenFunc)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Python36\Lib\unittest\mock.py", line 1179, in patched
return func(*args, …Run Code Online (Sandbox Code Playgroud) 给出一个简单的类
class Vector(object):
def __init__(self, value):
self.value = value
def __abs__(self):
return math.sqrt(sum([x**2 for x in self.value]))
def __round__(self, *n):
return [round(x,*n) for x in self.value]
Run Code Online (Sandbox Code Playgroud)
为什么在抱怨而不是期望的情况下abs(Vector([-3,4]))正确屈服,这又如何解决?5round(Vector([-3.1,4]))TypeError: a float is required[-3,4]
我知道round通常应该返回一个浮点数,但对于这个例子中的向量,可能的意义可能没有歧义,为什么这不能简单地被覆盖?我真的必须继承numbers.Real或定义Vector(...).round(n)吗?
python ×12
mocking ×3
python-2.7 ×3
python-3.x ×2
unit-testing ×2
attributes ×1
class ×1
datetime ×1
debugging ×1
django ×1
django-admin ×1
object ×1
oop ×1
rounding ×1
ruby ×1
string ×1
stub ×1
testing ×1
unicode ×1