Python Assign-Print语句?

时间:2011-10-25 04:29:45

标签: python

所以我正在编写一些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运行的脚本中实现此功能?

4 个答案:

答案 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最后。