TypeError:错误操作数类型为一元 - :'str'
问题描述:
我在Windows上遇到了Python 2.7.3-32bits的问题。我把这段代码看看是否有人能帮我解决这个错误。评论以西班牙文发表,但不影响代码。TypeError:错误操作数类型为一元 - :'str'
import gtk
import numpy
import math
import os
#Pedimos el nombre de la imagen de origen
nombreFich = input("Por favor, introduzca el nombre de la imagen de origen:")
#Validar que existe el fichero
imagen1 = gtk.Image()
imagen1.set_from_file('C:\\Users\\xxx\\Desktop\\xxxx.png')
pb1 = imagen1.get_pixbuf()
pm1 = pb1.get_pixels_array()
#Hacemos una copia de la imagen
pm2 = pm1.copy()
#Validamos los puntos de distorsion hasta que sean validos
puntos = " "
arrayPuntos = " "
while(puntos == " " and len(arrayPuntos) < 4):
print"Por favor, introduzca los puntos de distorsión xc yc r e:"
puntos= raw_input()
arrayPuntos = puntos.split(" ")
#Sacamos los puntos separando la cadena por el caracter espacio
xc =(puntos[0])
yc =(puntos[1])
r =(puntos[2])
e =(puntos[3])
#función que calcula el grado de distorsión
def grado(self,z,e):
if(z>1):
return 1
elif(e<0):
return (1/z)**(-e/(1-e))
else:
return z**e
#Distorsionamos la imagen
def distors(xc,yc,r,e,x,y):
d = math.sqrt(x**2+y**2)#Sacamos la distancia
z = d/r
if(z!=0):
g=grado(z,e)
xm=x*g
ym=y*g
return xm,ym
else:
xm=x
ym=y
return xm,ym
def recorrido (pm1, xc, yc, r, e):
pm2 = pm1.copy()
x= str(--r)
y= str(--r)
while (y <= r):
while (x <= r):
xm, ym = mover(xc, yc, r, e, x, y)
pm2[yc+y][xc+x] = pm1[yc+ym][xc+xm]
x = x+1
y= y+1
x= -r
return pm2
pm2 = recorrido(pm1, xc, yc, r, e)
#Guardamos los cambios
pb2 = gtk.gdk.pixbuf_new_from_array(pm2,pb1.get_colorspace(),pb1.get_bits_per_sample())
nomfich2 = nombreFich+"_copia"
ext = os.path.splitext("C:\\Users\xxx\Desktop\xxxx.png_copia")[1][1:].lower()
pb2.save("C:\\Users\xxx\Desktop\xxxx.png_copia",ext)
print"FINISH"
当我运行Python代码我得到以下错误:
Traceback (most recent call last):
File "F:\Dropbox\Práctica Pitón\Práctica3.0.py", line 71, in <module>
pm2 = recorrido(pm1, xc, yc, r, e)
File "F:\Dropbox\Práctica Pitón\Práctica3.0.py", line 59, in recorrido
x= str(--r)
TypeError: bad operand type for unary -: 'str'
答
该错误消息告诉你,r
是一个字符串。你不能否定一个字符串。
为什么它是一个字符串?好吧,它似乎来自这里:
# ...
puntos= raw_input()
arrayPuntos = puntos.split(" ")
# ...
r =(puntos[2])
字符串的split
方法返回一个字符串列表。
那么,你如何解决这个问题?那么,如果r
是字符串“22”,那么float(r)
是浮点数22.0
,而int(r)
是整数22
。其中之一可能就是你想要的。
一旦你添加了,比方说,r=int(r)
,你的--r
将不再是一个例外。
但它可能不是你想要的。在Python中,--r
仅仅意味着否定r
的否定,换句话说,它与-(-(r))
相同,这只是r
。您可能正在寻找C前缀运算符--
的等效项,该运算符会减少变量并返回新值。 Python中没有这样的操作符;实际上,没有修改变量然后返回值的运算符。
这是一个大问题的一部分。 Python旨在使语句和表达尽可能不同,以避免混淆。 C旨在尽可能多地表达事物,以节省打字量。所以,你经常不能一个一个地把它翻译成另一行。
在这种情况下,你必须做的两个步骤,如Thanasis Petsas显示:
r -= 1
x = str(r)
答
增量++
和减少--
运营商不支持的蟒蛇。 您可以使用,而不是这样的:
r -= 1
x = str(r)
这是真的,但它不是,为什么他得到这个错误。 – abarnert 2013-04-05 23:39:30