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

2024-03-29 12:32:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我习惯于用Java或C语言编写以下代码,不会出错。它允许我集中化字符串到浮点表示的转换。与下面的简单实现不同,我在Excel中处理负数的逗号或方括号的工作还有很多。你知道吗

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

我想知道是否有一种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)

Tags: to字符串代码声明顺序valjavaexcel
3条回答

以下是python的方法:

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

ZERO = toFloat('0.0')

喜欢在常量使用之前定义它们并不是Python的工作方式。最好的办法是学会喜欢这种做事方式,而不是依赖笨拙的变通方法。Python不像Java,不是所有的东西都必须包装在一堆类中。这通常会大大简化代码。一般来说,如果用Python创建一个类,比如示例中的Tools,它没有明确的具体用途,那么您可能应该将它从程序中删除。你知道吗

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

class Tools(object):

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

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

tools=Tools()
print tools.ZERO

您正在访问一个未定义的符号,这在许多语言中是个坏主意。 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

问题是你可以重新定义你的符号很多次你想。E、 g.这是合法代码:

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

如果在代码顶部声明ZERO是非常重要的,那么您可以对常量使用这个丑陋的hack:

把这个放在另一个文件里常量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)

相关问题 更多 >