我试图用Python学习单元测试,特别是unittest模块.
请考虑以下几行:
import unittest
class abc(unittest.TestCase):
def xyz():
...
if __name__ == "__main__":
unittest.main()
Run Code Online (Sandbox Code Playgroud)
由于调用,我可以看到我的所有测试用例都在运行unittest.main().
我很想知道这个调用是如何使所有测试用例运行的.
我知道,因为我从unittest.TestCase每个测试类继承,它正在做所有的魔术.任何见解?
为什么以下python3代码会产生错误?
a='''
def x():
print(42)
'''
class Test:
def __init__(self):
exec(a)
x()
t = Test()
Run Code Online (Sandbox Code Playgroud)
结果在此消息中:
Traceback (most recent call last):
File "bug.py", line 11, in <module>
t = Test()
File "bug.py", line 9, in __init__
x()
NameError: global name 'x' is not defined
Run Code Online (Sandbox Code Playgroud) 请考虑以下示例:
i=7
j=8
k=10
def test():
i=1
j=2
k=3
return dict((name,eval(name)) for name in ['i','j','k'])
Run Code Online (Sandbox Code Playgroud)
它返回:
>>> test()
{'i': 7, 'k': 10, 'j': 8}
Run Code Online (Sandbox Code Playgroud)
为什么eval不考虑函数内定义的变量?从文档中,您可以选择传递全局变量和本地字典.这意味着什么?最后,我如何修改这个小案例才能使它工作?
几周前我花了一些时间调查这个collections.namedtuple模块.该模块使用工厂函数将动态数据(新namedtuple类的名称和类属性名称)填充到一个非常大的字符串中.然后exec使用字符串(表示代码)作为参数执行,并返回新类.
有没有人知道为什么这样做,当有一种特定的工具可供现有的这种东西,即元类?我自己没有尝试过这样做,但似乎namedtuple模块中发生的一切都可以使用namedtuple元类轻松完成,如下所示:
class namedtuple(type):
Run Code Online (Sandbox Code Playgroud)
等等
我已经看到几个资源描述了什么.pyc文件以及它们何时被创建.但现在我想知道为什么在.py导入文件时创建它们?
另外,为什么不.pyc为执行导入的主Python文件创建文件?
我猜这与性能优化和学习有关,这鼓励我打破我的文件,因为内置的编译似乎很好用.但是我不确定是不是这种情况,而且我也很好奇是否有人有关于运行带和不带.pyc文件的程序之间差异的统计数据,如果它确实是速度的话.
我自己运行它们但是我没有一个好的,大的Python代码库来测试它.:(
我正在对各种模块进行一些解析和内省,但我不想解析内置模块.现在,内置模块没有特殊类型,就像有一个types.BuiltinFunctionType,所以我该怎么做?
>>> import CornedBeef
>>> CornedBeef
<module 'CornedBeef' from '/meatish/CornedBeef.pyc'>
>>> CornedBeef.__file__
'/meatish/CornedBeef.pyc'
>>> del CornedBeef.__file__
>>> CornedBeef
<module 'CornedBeef' (built-in)>
Run Code Online (Sandbox Code Playgroud)
根据Python,如果模块没有__file__属性,它显然是内置的.这是否意味着hasattr(SomeModule, '__file__')检查模块是否内置的方法是什么?当然,它并不常见del SomeModule.__file__,但有没有更坚实的方法来确定模块是否内置?
在Python中,len是一个通过调用对象的__len__方法来获取集合长度的函数:
def len(x):
return x.__len__()
Run Code Online (Sandbox Code Playgroud)
所以我希望直接呼叫__len__()至少能够达到最快速度len().
import timeit
setup = '''
'''
print (timeit.Timer('a="12345"; x=a.__len__()', setup=setup).repeat(10))
print (timeit.Timer('a="12345"; x=len(a)', setup=setup).repeat(10))
Run Code Online (Sandbox Code Playgroud)
但使用上述代码进行测试的结果显示len()更快.为什么?
我刚刚阅读了这个问题的答案:从类定义中的列表解析中访问类变量
它帮助我理解为什么以下代码导致NameError: name 'x' is not defined:
class A:
x = 1
data = [0, 1, 2, 3]
new_data = [i + x for i in data]
print(new_data)
Run Code Online (Sandbox Code Playgroud)
在NameError因为出现x在列表理解的特殊范围没有定义.但我无法理解为什么下面的代码没有任何错误.
class A:
x = 1
data = [0, 1, 2, 3]
new_data = [i for i in data]
print(new_data)
Run Code Online (Sandbox Code Playgroud)
我得到了输出[0, 1, 2, 3].但是我期待这个错误:NameError: name 'data' is not defined因为我期望就像在前面的例子中一样,名称x没有在列表推导的范围中定义,类似地,名称data也不会在列表推导的范围中定义.
能否帮助我理解为什么x列表理解范围没有定义但是data?
采用可清洗对象(如dict键或set项目)的容器.因此,字典只能有一个带有值的键1,1.0或者True等等.(注意:有些简化 - 允许哈希冲突,但这些值被认为是相等的)
我的问题是:解析顺序是否定义良好,是否可以跨实现预测结果对象?例如,OSX Python 2.7.11和3.5.1解释dict如下:
>>> { True: 'a', 1: 'b', 1.0: 'c', (1+0j): 'd' }
{True: 'd'}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,似乎保留了第一个键和最后一个值.
类似,在以下情况下set:
>>> { True, 1, 1.0, (1+0j) }
set([(1+0j)])
Run Code Online (Sandbox Code Playgroud)
这里似乎保留了最后一项.
但(如评论中所述):
>>> set([True, 1, 1.0])
set([True])
Run Code Online (Sandbox Code Playgroud)
现在保留了iterable中的第一个.
文档指出项目的顺序(例如in dict.items)是未定义的,但我的问题是指构造 dict或set对象的结果.
我们已经知道函数参数曾经有255个显式传递参数的限制.但是,此行为现在已更改,因为Python-3.7没有限制,除了sys.maxsize实际上是python容器的限制.但是局部变量怎么样?
我们基本上不能以动态方式向函数添加局部变量和/或locals()不允许直接更改字典,以便人们甚至可以用暴力方式测试它.但问题是,即使您更改locals()使用compile模块或exec函数它也不会影响function.__code__.co_varnames,因此,您无法在函数内显式访问变量.
In [142]: def bar():
...: exec('k=10')
...: print(f"locals: {locals()}")
...: print(k)
...: g = 100
...:
...:
In [143]: bar()
locals: {'k': 10}
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-143-226d01f48125> in <module>()
----> 1 bar()
<ipython-input-142-69d0ec0a7b24> in bar()
2 exec('k=10')
3 print(f"locals: {locals()}")
----> 4 print(k)
5 g = 100
6
NameError: name 'k' is not defined
In [144]: bar.__code__.co_varnames
Out[144]: …Run Code Online (Sandbox Code Playgroud) python ×10
python-internals ×10
python-3.x ×2
bytecode ×1
dictionary ×1
eval ×1
function ×1
internals ×1
metaclass ×1
module ×1
namedtuple ×1
namespaces ×1
pyc ×1
python-3.4 ×1
scope ×1
set ×1
unit-testing ×1