使用在其后声明的函数初始化Python常量

时间:2013-11-06 19:48:55

标签: python

我习惯用Java或C#编写以下代码而不会出错。它允许我将字符串转换集中到浮点表示。与下面的简单实现不同,我还有更多的东西用于处理Excel中负数的逗号或括号。

我能理解为什么Python会出错。 Python代码不是编译的,而是按顺序解释的,而且toFloat在处理ZERO的声明时不存在toFloat

我想知道是否有一种pythonic方法可以做到这一点,而不必将ZERO函数拉到另一个模块或者不必在最顶层声明ZERO = toFloat('0.0') # <-- ERROR on this line "Undefined variable: toFloat" def toFloat(val): """Function to convert a string to a float""" return Decimal(val)

{{1}}

3 个答案:

答案 0 :(得分:1)

您正在访问未定义的符号,这在许多语言中都是一个坏主意。 Python不知道符号toFloat可能引用什么。

为了说明,您希望此代码能做什么? ZERO应该为零还是一个?

ZERO = toFloat('0.0')

def toFloat(val): return Decimal(val)
def toFloat(val): return 1

或者在这种情况下:

ZERO = toFloat('0.0')

if ZERO: from libone import toFloat #where toFloat returns 0
else: from libtwo import toFloat #where toFloat returns 1

问题是你可以多次重新定义你的符号。例如。这是合法的代码:

def f(): return 0
print(f())
def f(): return 1
print(f())

如果在代码顶部声明ZERO至关重要,也许你可以将这个丑陋的黑客用于你的常量:

把它放在另一个文件中,比方说const.py:

class Constant:
    def __init__(self, cf):
        self.cf = cf

    @property
    def c(self):
        try: return self.__c
        except: self.__c = self.cf()
        return self.__c

然后在您的文件中,您可以使用:

from const import Constant

ZERO = Constant(lambda: toFloat('0.0'))
def toFloat(x): return 42
print(ZERO.c)

答案 1 :(得分:0)

我提出了以下代码,我认为它是干净的,并将声明保留在顶部,同时允许我保留下面的代码,但仍然使用它来初始化我的变量。

class Tools(object):

    def __init__(self):
        self.ZERO = self.toFloat('0.0')

    def toFloat(self, val):
        return float(val)

tools=Tools()
print tools.ZERO

答案 2 :(得分:0)

以下是Pythonic的做法:

def toFloat(val):
    """Function to convert a string to a float"""
    return Decimal(val)

ZERO = toFloat('0.0')

在他们使用的东西之前,最好定义你的常量,而不是在Python中如何工作。做恕我直言的最好的事情就是学会喜欢这种做事方式,而不是依靠笨拙的解决方法。 Python并不像Java,不是所有东西都必须包装在一堆类中。这通常会简化代码。作为一般的经验法则,如果你在Python中创建一个类,例如你的例子中的Tools,它没有明确的具体目的,你应该把它从程序中删除。