所以我正在编写一些python脚本来帮助我做一些简单的计算:
WireRadius = .455 / 1000 / 2 #m, 25AWG
CoilInnerRadius = 10.0 / 1000 / 2 #m
CoilOuterRadius = 20.0 / 1000 / 2 #m
CoilLength = 20.0 / 1000 #m
CoilVolume = 3.14 * (CoilOuterRadius**2 - CoilInnerRadius**2) * CoilLength #m^3
print "CoilVolume: " + str(CoilVolume)
WireCrossSection = 3.14 * WireRadius**2 #m^2
print "WireCrossSection: " + str(WireCrossSection)
LengthOfWire = CoilVolume / WireCrossSection / 2 #m
print "LengthOfWire: " + str(LengthOfWire)
现在,我希望脚本打印出所有中间组件,这样我就可以看到发生了什么。如果我搞砸了,这也可以让我找到我的数学错误的行,因为那时数字变得荒谬了。
然而,这显然不是很干,因为我写的每个变量名不是一次,不是两次,而是三次:
LengthOfWire = CoilVolume / WireCrossSection / 2 #m
print "LengthOfWire: " + str(LengthOfWire)
如果我在交互式shell中输入它,它会自动向我吐出中间组件的值:
>>> LengthOfWire = CoilVolume / WireCrossSection / 2 #m
14.491003502
这是非常好的,因为保留赋值语句意味着我确切知道下一个值是什么。但是,将它放在交互式shell中的问题是进行更改并重新运行整个脚本(这是几十次计算很长)是单调乏味的。有没有办法在通过python script.py运行的脚本中实现此功能?
答案 0 :(得分:3)
def debug(val):
logging.debug('DEBUG: %r', val)
return val
...
LengthOfWire = debug(CoilVolume / WireCrossSection / 2)
不要忘记妥善设置logger。
答案 1 :(得分:2)
Ignacio功能的改进版本:
import logging
def debug(val, label=None):
"""Prints a debug message consisting of a value and an optional label."""
if label is None:
logging.debug('DEBUG: %r', val)
else:
logging.debug('DEBUG: %s = %r', label, val)
return val
...
LengthOfWire = debug(CoilVolume / WireCrossSection / 2, label="Wire length")
答案 2 :(得分:1)
考虑使用pdb来监控执行情况。我怀疑在你完成计算后你会想要所有那些记录语句。
Doug Hellmann有a nice worked-out example of using pdb。答案 3 :(得分:0)
我认为debug
函数可能是最好的,但是如果你真的想在没有模糊表达式的情况下进行赋值,实际上可以使用元类:
class print_dict(dict):
def __setitem__(self, key, value):
if not key.startswith('_'):
print("{}: {}".format(key, value))
super().__setitem__(key, value)
class MetaPrint(type):
@classmethod
def __prepare__(metacls, name, bases):
return print_dict()
def __new__(cls, name, bases, classdict):
result = type.__new__(cls, name, bases, dict(classdict))
return result
def foo(x):
class ShowMe(metaclass=MetaPrint):
WireRadius = x / 1000 / 2 #m, 25AWG
CoilInnerRadius = 10.0 / 1000 / 2 #m
CoilOuterRadius = 20.0 / 1000 / 2 #m
CoilLength = 20.0 / 1000 #m
CoilVolume = 3.14 * (CoilOuterRadius**2 - CoilInnerRadius**2) * CoilLength #m^3
WireCrossSection = 3.14 * WireRadius**2 #m^2
LengthOfWire = CoilVolume / WireCrossSection / 2 #m
foo(.455)
然后,当你已经对所有内容进行了排序时,只需删除class ShowMe...
行并取消该类主体。这个的主要限制是你不能在类体内部return
,所以如果你需要一个返回值,你必须给它一个名字,例如return ShowMe.LengthOfWire
最后。