How to recognize float variable? getting ValueError: could not convert string to float:
How to recognize float variable? getting ValueError: could not convert string to float:
我正在尝试为我在 Python 中编写的信号分析模拟创建一个 GUI。为此,我使用 AppJar。但是,当我调用生成信号的函数时,我得到了标题中的 ValueError。
我已经阅读了 Whosebug 上的每一个 ValueError post(我可能错过了一个,但我尽力了)并且所有这些都是关于额外的间距,无法解析为浮点数等 None 似乎适用于此。
基本上,我使用这段代码调用一个函数来生成我的信号:
signal_axes = app.addPlot("signal", *logic.signal(5, 2), 0, 0, 1)
以及函数本身的相关部分(在导入的文件logic.py中)
def signal(electrodes, length):
velocity = math.sqrt((3.2e-19 * kinetic_energy) / (mass * 1.66e-27))
frequency = velocity / length
这不是整个函数,变量都已声明,未使用的变量稍后在函数中使用。
错误特别指向带有"frequency = velocity / length"的行,告诉我:
TypeError: unsupported operand type(s) for /: 'float' and 'str'
当我尝试使用 "float(length)" 修复它时,出现错误:
ValueError: could not convert string to float:
在 StackExchange 的一个答案中,有人建议使用 .strip() 来去除不可见的空间。所以我尝试使用:
length.strip()
但这给了我以下错误:
AttributeError: 'float' object has no attribute 'strip'
我在这里慢慢陷入疯狂。顺便说一下,下面的代码 stand-alone 有效:
import numpy as np
kinetic_energy = 9000
mass = 40
length = 2e-2
velocity = np.sqrt((3.2e-19 * kinetic_energy) / (mass * 1.66e-27))
frequency = float(velocity) / float(length)
print(frequency)
谁能看出哪里出了问题?我在下面包含了所有相关代码,这不是我的完整文件,但仅此一项就应该至少提供一个输出。
run.py
import logic
from appjar import gui
def generate(btn):
app.updatePlot("signal", *logic.signal(app.getEntry("electrodes"), app.getEntry("length")))
showSignalLabels()
def showSignalLabels():
signal_axes.set_xlabel("time (us)")
signal_axes.set_ylabel("amplitude (uV)")
app.refreshPlot("signal")
app = gui()
signal_axes = app.addPlot("signal", *logic.signal(5, 0.02), 0, 0, 1)
app.addLabelEntry("electrodes", 1, 0, 1)
app.addLabelEntry("length", 2, 0, 1)
showSignalLabels()
app.addButton("Generate", generate)
app.go()
logic.py
import numpy as np
import math
import colorednoise as cn
steps = 5000
amplitude = 1
offset_code = 0
kinetic_energy = 9000
mass = 40
centered = 1
def signal(electrodes, length):
velocity = math.sqrt((3.2e-19 * kinetic_energy) / (mass * 1.66e-27))
frequency = velocity / length
time = 2 * (electrodes / frequency)
--- irrelevant code ---
return OutputTime, OutputSignal
编辑:这里是完整的回溯。
Exception in Tkinter callback
Traceback (most recent call last):
File "E:\Internship IOM\WPy64-3720\python-3.7.2.amd64\lib\tkinter\__init__.py", line 1705, in __call__
return self.func(*args)
File "E:\Internship IOM\PythonScripts\appJar\appjar.py", line 3783, in <lambda>
return lambda *args: funcName(param)
File "E:/Internship IOM/PythonScripts/appJar/testrun.py", line 12, in generate
app.updatePlot("signal", *logic.signal(app.getEntry("electrodes"), app.getEntry("length")))
File "E:\Internship IOM\PythonScripts\appJar\logic.py", line 33, in signal
frequency = velocity / length
TypeError: unsupported operand type(s) for /: 'float' and 'str'
您应该在调用站点进行转换,即:
def generate(btn):
app.updatePlot("signal", *logic.signal(app.getEntry("electrodes"),
float(app.getEntry("length"))))
...
因为否则你的函数 logic.signal
接收不同的类型(str
和 float
)。这就是为什么您收到有关 float
没有 strip
的其他错误的原因,因为您在代码的其他地方做了:
signal_axes = app.addPlot("signal", *logic.signal(5, 0.02), 0, 0, 1)
在这里你传递一个float
。
由于您最初的错误是 could not convert string to float
带有明显的空字符串,因此您需要采取额外措施来防止应用程序出现空值。您可以使用 try ... except
:
def generate(btn):
try:
length = float(app.getEntry("length"))
except ValueError:
# Use some default value here, or re-raise.
length = 0.
app.updatePlot("signal", *logic.signal(app.getEntry("electrodes"), length))
我正在尝试为我在 Python 中编写的信号分析模拟创建一个 GUI。为此,我使用 AppJar。但是,当我调用生成信号的函数时,我得到了标题中的 ValueError。
我已经阅读了 Whosebug 上的每一个 ValueError post(我可能错过了一个,但我尽力了)并且所有这些都是关于额外的间距,无法解析为浮点数等 None 似乎适用于此。
基本上,我使用这段代码调用一个函数来生成我的信号:
signal_axes = app.addPlot("signal", *logic.signal(5, 2), 0, 0, 1)
以及函数本身的相关部分(在导入的文件logic.py中)
def signal(electrodes, length):
velocity = math.sqrt((3.2e-19 * kinetic_energy) / (mass * 1.66e-27))
frequency = velocity / length
这不是整个函数,变量都已声明,未使用的变量稍后在函数中使用。
错误特别指向带有"frequency = velocity / length"的行,告诉我:
TypeError: unsupported operand type(s) for /: 'float' and 'str'
当我尝试使用 "float(length)" 修复它时,出现错误:
ValueError: could not convert string to float:
在 StackExchange 的一个答案中,有人建议使用 .strip() 来去除不可见的空间。所以我尝试使用:
length.strip()
但这给了我以下错误:
AttributeError: 'float' object has no attribute 'strip'
我在这里慢慢陷入疯狂。顺便说一下,下面的代码 stand-alone 有效:
import numpy as np
kinetic_energy = 9000
mass = 40
length = 2e-2
velocity = np.sqrt((3.2e-19 * kinetic_energy) / (mass * 1.66e-27))
frequency = float(velocity) / float(length)
print(frequency)
谁能看出哪里出了问题?我在下面包含了所有相关代码,这不是我的完整文件,但仅此一项就应该至少提供一个输出。
run.py
import logic
from appjar import gui
def generate(btn):
app.updatePlot("signal", *logic.signal(app.getEntry("electrodes"), app.getEntry("length")))
showSignalLabels()
def showSignalLabels():
signal_axes.set_xlabel("time (us)")
signal_axes.set_ylabel("amplitude (uV)")
app.refreshPlot("signal")
app = gui()
signal_axes = app.addPlot("signal", *logic.signal(5, 0.02), 0, 0, 1)
app.addLabelEntry("electrodes", 1, 0, 1)
app.addLabelEntry("length", 2, 0, 1)
showSignalLabels()
app.addButton("Generate", generate)
app.go()
logic.py
import numpy as np
import math
import colorednoise as cn
steps = 5000
amplitude = 1
offset_code = 0
kinetic_energy = 9000
mass = 40
centered = 1
def signal(electrodes, length):
velocity = math.sqrt((3.2e-19 * kinetic_energy) / (mass * 1.66e-27))
frequency = velocity / length
time = 2 * (electrodes / frequency)
--- irrelevant code ---
return OutputTime, OutputSignal
编辑:这里是完整的回溯。
Exception in Tkinter callback
Traceback (most recent call last):
File "E:\Internship IOM\WPy64-3720\python-3.7.2.amd64\lib\tkinter\__init__.py", line 1705, in __call__
return self.func(*args)
File "E:\Internship IOM\PythonScripts\appJar\appjar.py", line 3783, in <lambda>
return lambda *args: funcName(param)
File "E:/Internship IOM/PythonScripts/appJar/testrun.py", line 12, in generate
app.updatePlot("signal", *logic.signal(app.getEntry("electrodes"), app.getEntry("length")))
File "E:\Internship IOM\PythonScripts\appJar\logic.py", line 33, in signal
frequency = velocity / length
TypeError: unsupported operand type(s) for /: 'float' and 'str'
您应该在调用站点进行转换,即:
def generate(btn):
app.updatePlot("signal", *logic.signal(app.getEntry("electrodes"),
float(app.getEntry("length"))))
...
因为否则你的函数 logic.signal
接收不同的类型(str
和 float
)。这就是为什么您收到有关 float
没有 strip
的其他错误的原因,因为您在代码的其他地方做了:
signal_axes = app.addPlot("signal", *logic.signal(5, 0.02), 0, 0, 1)
在这里你传递一个float
。
由于您最初的错误是 could not convert string to float
带有明显的空字符串,因此您需要采取额外措施来防止应用程序出现空值。您可以使用 try ... except
:
def generate(btn):
try:
length = float(app.getEntry("length"))
except ValueError:
# Use some default value here, or re-raise.
length = 0.
app.updatePlot("signal", *logic.signal(app.getEntry("electrodes"), length))