我发现自己写了这样的断言:
if f(x, y) != z:
print(repr(x))
print(repr(y))
print(repr(z))
raise MyException('Expected: f(x, y) == z')
Run Code Online (Sandbox Code Playgroud)
我想知道是否有办法编写一个函数来接受一个有效的Python表达式和一个异常类作为输入,计算表达式,如果它发现它是假的,打印出每个最低级别的表示表达式中的术语并提出给定的异常?
# validate is the mystery function
validate('f(x, y) == z', MyException)
Run Code Online (Sandbox Code Playgroud) 世界包含位于不同位置的代理,在任何位置只有一个代理.每个代理都知道他在哪里,但我还需要快速检查给定位置是否有代理.因此,我还保留了从地点到代理商的地图.我在决定一个问题,即该地图属于:class World,class Agent(作为一个阶级属性)或其他地方.
在下面我把查找表agent_locations放在class World.但现在代理商world.update_agent_location每次搬家都要打电话.这很烦人; 如果我稍后决定跟踪代理的其他事情,除了他们的位置之外Agent怎么办?我是否需要在整个代码中将回调添加回世界对象?
class World:
def __init__(self, n_agents):
# ...
self.agents = []
self.agent_locations = {}
for id in range(n_agents):
x, y = self.find_location()
agent = Agent(self,x,y)
self.agents.append(agent)
self.agent_locations[x,y] = agent
def update_agent_location(self, agent, x, y):
del self.agent_locations[agent.x, agent.y]
self.agent_locations[x, y] = agent
def update(self): # next step in the simulation
for agent in self.agents:
agent.update() # next step for this agent
# ...
class …Run Code Online (Sandbox Code Playgroud) Input: two lists (list1, list2) of equal length
Output: one list (result) of the same length, such that:
result[i] = list1[i] + list2[i]
Run Code Online (Sandbox Code Playgroud)
有没有简洁的方法呢?或者这是最好的:
# Python 3
assert len(list1) == len(list2)
result = [list1[i] + list2[i] for i in range(len(list1))]
Run Code Online (Sandbox Code Playgroud) 我想用字符串替换模式.字符串以变量形式给出.它当然可能包含'\ 1',它不应该被解释为反向引用 - 而只是作为\ 1.
我怎样才能做到这一点?
我正在构建一个包含各种函数的库,这些函数将在项目中经常重用。每个函数都是无状态的(创建时不需要参数,并且没有任何内存)。有些函数使用其他函数。
这些函数将作为参数在项目的其余部分传递。
以下哪种方法更好?
1.将某个模块中的所有函数定义为全局函数:
def f1(x):
# use x
def f2(x):
# use x and f1
Run Code Online (Sandbox Code Playgroud)
2.将所有函数定义为类中的方法,并根据用途将类排列在层次结构中:
class F1:
def __call__(x):
# use x
f1 = F1()
class F2(F1):
def __call__(x):
# use x and f1
f2 = F2()
Run Code Online (Sandbox Code Playgroud)
我什至考虑选项 2 的原因是我的一些功能有一些共同点。例如,函数f2, f3,f11都通过调用 开始f1。我想我可能想做这样的事情:
class F1:
def __call__(self, x):
self.f1(x)
self.calc(x)
def f1(self, x):
# do something
# don't define calc here; F1 is abstract base class
class F2(F1):
def calc(self, x):
# …Run Code Online (Sandbox Code Playgroud) Python不支持复杂的匿名函数.什么是好的选择?例如:
class Calculation:
def __init__(self, func):
self.func = func
def __call__(self, data):
try:
# check if the value has already been calculated
# if it has, it would be cached under key = self.func
return data[self.func]
except KeyError:
pass # first-time call; calculate and cache the values
data[self.func] = self.func(data)
return data[self.func]
# with a simple function, which can be represented using lambda, this works great
f1 = Calculation(lambda data : data['a'] * data['b'])
# with a complicated function, I …Run Code Online (Sandbox Code Playgroud) 我每次做出一些我认为可能有用的更改时都会提交:我在提交之前不进行大量测试.此外,我的提交很快将被自动推送到远程存储库.(我是唯一的开发人员,我必须每天多次添加功能或重写部分代码.)
我想设置一台远程计算机,每当我提交任何东西时自动运行回归测试; 然后给我发回电子邮件差异报告.
设置它的最简单方法是什么?
我的所有代码都在Python 3中.我自己的系统是Windows 7,ActiveState Python,TortoiseHG和Wing IDE.我可以将远程计算机设置为Linux或Windows.该应用程序是所有命令行,具有文本输入和输出.
我有一个小的命令行应用程序(约6k行).它没有单元测试,因为我不知道怎么写它们; 但我现在追溯性地添加一些.我读了这个教程但是我对如何使用这个模块测试整个应用程序感到困惑; 事实上,我甚至不确定我想要做什么被称为"单元测试".
具体来说,如果我使用某些参数运行我的应用程序,它应该生成某些输出文件.我想确保那些输出文件不变.
即,我的应用程序的以下命令行调用:
main.py config1.txt 100 15
main.py config2.txt def 10 qa
etc.....
Run Code Online (Sandbox Code Playgroud)
创建一些小的输出文本文件(每个<10 MB)并将它们放入单个文件夹(每次调用一个),命名如下:
output/config1.100.15.201202011733/
output/config2.def.10.qa.201202011733/
etc...
Run Code Online (Sandbox Code Playgroud)
每个文件夹包含一些小文本文件(每个<10MB).每次迭代代码更改后,我都想用几十个命令行参数运行我的应用程序,并注意输出文件不同的任何情况.(理想情况下,我想做更多的事情;例如,对于某些输出文件,将它们作为带有特定主键的制表符分隔表进行比较,这样如果行顺序改变,它们仍将评估为相等;但这不是危急).
设置它的好方法是什么?
我有两个列表,old并且new具有相同数量的元素.
我正在尝试编写一个有效的函数,它将n参数作为参数,在相同位置比较两个列表的元素(按索引),找出n最大的差异,并返回这些n元素的索引.
我认为这最好通过值排序的字典来解决,但是Python中没有一个(并且我不知道任何提供它的库).也许有更好的解决方案?
在某些情况下,我想打印调试样式的输出,如下所示:
# module test.py
def f()
a = 5
b = 8
debug(a, b) # line 18
Run Code Online (Sandbox Code Playgroud)
我希望该debug函数打印以下内容:
debug info at test.py: 18
function f
a = 5
b = 8
Run Code Online (Sandbox Code Playgroud)
我认为应该可以通过使用inspect模块定位堆栈框架,然后查找相应的行,查找该行中的源代码,从那里获取参数的名称.可以通过向上移动一个堆栈帧来获得函数名称.(参数的值很容易获得:它们直接传递给函数debug.)
我是在正确的轨道上吗?有没有我可以参考的食谱?