小编Smu*_*oxo的帖子

Python3-在函数内调用 exec(open().read()) 时出现问题

我在 python 脚本中运行 python 脚本时遇到问题,我根本不明白:

假设我们在同一目录中有 2 个文件:'init.py' 和 'text.py'

初始化.py:

X = 5
print("init.py was run")
Run Code Online (Sandbox Code Playgroud)

测试.py:

exec(open("./init.py").read())
print("X = %s" %X)
Run Code Online (Sandbox Code Playgroud)

如果我现在运行 test.py,我会得到

init.py 已运行

X = 5

但是,如果我将 test.py 更改为:

def func_call( filename):
  exec(open(filename).read())
  print("X = %s" %X)

func_call("./init.py")
Run Code Online (Sandbox Code Playgroud)

我得到:

init.py 已运行

回溯(最近一次调用最后一次):

文件“test.py”,第 5 行,位于

func_call("./init.py")   
Run Code Online (Sandbox Code Playgroud)

文件“test.py”,第 3 行,在 func_call 中

print("X = %s" %X) 
Run Code Online (Sandbox Code Playgroud)

名称错误:名称“X”未定义

有人可以向我解释为什么这会导致不同的结果吗?有解决方法吗?我的目标是通过运行 python 脚本并访问该 python 脚本中设置的变量来初始化大部分变量。

python file exec python-3.x

3
推荐指数
1
解决办法
7304
查看次数

Pytest:需要缓慢初始化的参数化测试

我想使用非常慢的init方法对类的随机参数进行测试。测试本身非常快,但需要一个耗时的初始化步骤。当然。我做这样的事情:

@pytest.mark.parametrize("params", LIST_OF_RANDOMIZED_PARAMS)
def test_one(params):
    state = very_slow_initialization(params)
    assert state.fast_test()

@pytest.mark.parametrize("params", LIST_OF_RANDOMIZED_PARAMS)
def test_two(params):
    state = very_slow_initialization(params)
    assert state.another_fast_test()
Run Code Online (Sandbox Code Playgroud)

到目前为止,我从失败的尝试中了解到:

  1. 不支持使用参数化的 set_class(params) 方法初始化测试类
  2. 使用初始化类的夹具每次仍然调用慢初始化
  3. 我可以提前创建一个包含所有初始化状态的列表,但是它们需要大量内存。此外,有时我喜欢在一夜之间进行大量随机测试,然后在第二天早上停止它们。这一点我需要确切地知道我应该进行多少次测试,以便在此之前完成所有初始化。
  4. 如果可能的话,我更喜欢对第一个参数运行两个测试的解决方案,然后用第二个参数运行,依此类推。

可能有一个非常简单的解决方案。

python pytest

3
推荐指数
1
解决办法
92
查看次数

标签 统计

python ×2

exec ×1

file ×1

pytest ×1

python-3.x ×1