0

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

我可以理解为什么 Python 会出错。Python 代码不是编译而是按顺序解释的,并且toFloat在处理ZERO.

我想知道是否有一种pythonic方式可以做到这一点,而不必将函数拉到toFloat另一个模块,或者不必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)
4

3 回答 3

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,也许您可​​以将这个丑陋的 hack 用于您的常量:

把它放在另一个文件中,比如说 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)
于 2013-11-06T19:54:25.900 回答
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
于 2013-11-06T20:30:02.070 回答
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没有明确具体目的的类,例如在您的示例中,您可能应该将其从程序中删除。

于 2013-11-07T18:26:34.903 回答