我习惯用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}}
答案 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
,它没有明确的具体目的,你应该把它从程序中删除。