我正在运行的每个单元测试都是将python代码写入文件,然后将其作为模块导入.问题是代码更改但进一步的import语句不会修改模块.
我认为我需要的是一种方法来强制重新加载模块或清除内部字节码缓存.有任何想法吗?
谢谢!
运行:
import pickle
class Foo(str):
def __new__(cls, s, bar):
self = super(Foo, cls).__new__(cls, s)
self.bar = bar
return self
with open('foo.pkl', 'wb') as w:
x = pickle.dump(Foo('', 1), w, pickle.HIGHEST_PROTOCOL)
with open('foo.pkl', 'rb') as w:
x = pickle.load(w)
Run Code Online (Sandbox Code Playgroud)
此例外的结果:
Traceback (most recent call last):
File "pkl.py", line 13, in <module>
x = pickle.load(w)
File "/usr/lib/python2.7/pickle.py", line 1378, in load
return Unpickler(file).load()
File "/usr/lib/python2.7/pickle.py", line 858, in load
dispatch[key](self)
File "/usr/lib/python2.7/pickle.py", line 1083, in load_newobj
obj = cls.__new__(cls, *args)
TypeError: __new__() …Run Code Online (Sandbox Code Playgroud) 我想向某人展示如何使用is而不是==比较整数会失败。我认为这会起作用,但它没有:
>>> import copy
>>> x = 1
>>> y = copy.deepcopy(x)
>>> x is y
True
Run Code Online (Sandbox Code Playgroud)
对于更大的整数,我可以很容易地做到这一点:
>>> x = 500
>>> y = 500
>>> x is y
False
Run Code Online (Sandbox Code Playgroud)
我如何用较小的整数来演示相同的事情,这些整数通常可能用于 python 中的类似枚举的目的?
我发现了CPython实现,Python对象的结构和Python字节码.
玩函数,我发现空函数的堆栈大小为1.
为什么?声明什么var占用堆栈空间?
空功能:
def empty():
pass
Run Code Online (Sandbox Code Playgroud)
功能信息:
>>> dis.show_code(empty)
Name: empty
Filename: <pyshell#27>
Argument count: 0
Kw-only arguments: 0
Stack size: 1
Number of locals: 0
Variable names:
Constants:
0: None
Names:
Flags: OPTIMIZED, NEWLOCALS, NOFREE
First line number: 1
Free variables:
Cell variables:
Run Code Online (Sandbox Code Playgroud)
与当地人的作用:
def withlocals():
first = 0
second = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
功能信息:
>>> dis.show_code(withlocals)
Name: withlocals
Filename: <pyshell#27>
Argument count: 0
Kw-only arguments: 0
Stack size: 3
Number of locals: 2
Variable names:
0: …Run Code Online (Sandbox Code Playgroud) 我注意到Python的字节码在这里有一个有趣的特点.
该CONTINUE_LOOP操作码取入一个target将表示循环的指令继续执行,这是一个参数FOR_ITER的指令.
该BREAK_LOOP操作码,但是,并没有做到这一点.它只会突破当前(最里面)的循环.
这背后的原因是什么?为什么它可能continue而不是break外循环?
既然字典是在python 3.6中排序的,那么必须有一种方法可以只用两行来获取字典的第一个和第二个值.现在,我必须用7行来完成这个:
for key, value in class_sent.items():
i += 1
if i == 1:
first_sent = value
elif i == 2:
second_sent = value
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
first_sent = next(iter(class_sent))
second_sent = next(iter(class_sent))
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,second_sent等于first_sent.如果有人知道如何在尽可能少的行中获取字典中的第一个和第二个值,我会非常感激.
我在跑:
Python 2.7.8 (default, Oct 6 2017, 09:25:50)
GCC 4.1.2 20070626 (Red Hat 4.1.2-14) on Linux 2
Run Code Online (Sandbox Code Playgroud)
根据文件:
运营商
is和is not测试对象标识:x is y是True当且仅当x和y是相同的对象.
为了获得对象的身份,我们可以使用该id功能.
如果我们打开一个新的REPL,我们可以看到它300并-6具有相同的标识(在CPython上,这意味着它们都引用相同的内存地址):
>>> id(300)
94766593705400
>>> id(-6)
94766593705400
Run Code Online (Sandbox Code Playgroud)
请注意,实际值可能因执行而异,但它们始终相等.
然而,做300 is -6收益率False:
>>> 300 is -6
False
Run Code Online (Sandbox Code Playgroud)
我有一些问题:
300和-6分享相同的身份? …我正在编写一个生成多个C线程的C程序,每个线程一个Python子解释器。子解释器不共享任何可变的Python变量,它们彼此隔离。(它们确实对从C程序的main()函数公开的公共PyObject(不可变)具有只读访问权限)。
在子解释器之间不共享GIL的情况下,是否可以在Python 3.7或3.8中实现?
这是我一直在尝试的伪代码:
void *spawnInterpreter(void* p) {
…
PyThreadState* save_tstate = PyThreadState_Swap(NULL);
PyThreadState* tstate = Py_NewInterpreter();
PyThreadState_Swap(save_tstate);
//do some Python work (with variables that are NOT shared with other thread’s sub-interpreter
PyRun_SimpleString( . . .);
. . .
}
int main() {
...
pthread_create(&thread1, NULL, spawnInterpreter, “in1”);
pthread_create(&thread2, NULL, spawnInterpreter, "in2");
...
}
Run Code Online (Sandbox Code Playgroud)
我可以使它在3.6中工作(无需获取GIL或PyThreadState在C线程中进行管理),但是在Python 3.7中,我得到了:
[New Thread 0x7ffff5f78700 (LWP 16392)]
Fatal Python error: drop_gil: GIL is not locked
Run Code Online (Sandbox Code Playgroud) 我正在研究CPython的代码库。
我想知道在哪里可以找到表中math_sin显示的函数的定义:mathmethodsmathmodule.c
{"sin", math_sin, METH_O, math_sin_doc}
Run Code Online (Sandbox Code Playgroud)
这样做grep "math_sin" -wr的主要cpython文件夹中唯一的回报:
Modules/mathmodule.c: {"sin", math_sin, METH_O, math_sin_doc},
Run Code Online (Sandbox Code Playgroud)
在哪里可以找到此函数的定义?
以下两个代码是等效的,但是第一个大约占用700M内存,后一个仅占用约100M内存(通过Windows任务管理器)。这里会发生什么?
def a():
lst = []
for i in range(10**7):
t = "a"
t = t * 2
lst.append(t)
return lst
_ = a()
Run Code Online (Sandbox Code Playgroud)
def a():
lst = []
for i in range(10**7):
t = "a" * 2
lst.append(t)
return lst
_ = a()
Run Code Online (Sandbox Code Playgroud) cpython ×10
python ×10
bytecode ×1
c ×1
dictionary ×1
loops ×1
object ×1
pickle ×1
python-2.7 ×1
python-2.x ×1
python-3.6 ×1
python-3.x ×1
python-c-api ×1
string ×1