鱼C论坛

 找回密码
 立即注册
查看: 1870|回复: 10

[已解决]为何返回错误提示?

[复制链接]
发表于 2022-7-8 21:36:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 lzb1001 于 2022-7-9 06:22 编辑

# 设置透明度

import pygame
import sys
from pygame.locals import *


pygame.init()


size = width, height = 640, 480
bg = (0, 0, 0)


clock = pygame.time.Clock()
screen = pygame.display.set_mode(size)
pygame.display.set_caption('FishC Demo')


turtle = pygame.image.load(r'd:\\work\tortoise.png').convert_alpha()
background = pygame.image.load(r'd:\\work\\grass.jpg').convert()
position = turtle.get_rect()
position.center = width // 2, height // 2
print(position, '\n上:', position.top, '\n下:', position.bottom, '\n左:', position.left, '\n右:', position.right, '\n宽度:', position.width, '\n高度:', position.height, '\n中心点:', position.center)




def blit_alpha(
        target: pygame.Surface,
        source: pygame.Surface,
        location: tuple[int, int],
        opacity: int
) -> None:


    x, y = location[0], location[1]

   
    temp = pygame.Surface((source.get_width(), source.get_height())).convert()

   
    temp.blit(target, (-x, -y))
   
    temp.blit(source, (0, 0))

   
    temp.set_alpha(opacity)

   
    target.blit(temp, location)
   
   


while True:
   
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()


   
    screen.blit(background, (0, 0))
   

   
    blit_alpha(target=screen, source=turtle, opacity=200, location=position)
   

    pygame.display.flip()

    clock.tick(30)

------------------------------------------
Windows 10 专业版 | Python 3.7.6
------------------------------------------

【我的问题】以上代码

---在IDLE中执行后返回错误提示如下:

Traceback (most recent call last):
  File "D:\work\p16_5_pg_3_turtle.py", line 51, in <module>
    location: tuple[int, int],
TypeError: 'type' object is not subscriptable


---尝试在pycharm中执行,返回错误提示如下:

Traceback (most recent call last):
  File "D:/work/p16_5_pg_3_turtle.py", line 51, in <module>
    location: tuple[int, int],
TypeError: 'type' object is not subscriptable
libpng warning: iCCP: known incorrect sRGB profile


两个结果相比,后者多了最后一行

但仍不知道哪里错了?是不是因为python版本的问题?

******************************

感谢大神不吝赐教,为新手解疑释惑。

赠人玫瑰,手有余香,好人一生平安!
最佳答案
2022-7-9 09:57:50
这个问题严格来说不是TypeError而是版本问题。之前的回答中已经告诉你了,我使用了类型注释,类型注释从Python 3.2就已经引入了,之后也一直在不断变化。使用类型注释最大的好处是可以直接看清楚参数的类型,降低阅读代码难度,省去了猜测参数类型的麻烦。Python的类型注释这个特性非常好的一点是类型注释不是强制的,不是侵入式的,简单来说就是有它没它都可以运行。
解决问题最简单的办法就是删除报错的部分tuple[int, int],注意location后面的冒号也要删除。
如果还想保留这个类型注释就要做一些简单的修改,首先在代码开头写上from typing import Tuple(typing是负责类型标注的标准库,不用下载),然后把出错的部分tuple[int, int]改成Tuple[int, int]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-8 21:51:13 From FishC Mobile | 显示全部楼层
本帖最后由 hrpzcf 于 2022-7-8 21:58 编辑

报错说第51行,对type类型的数据使用下标取值了。

它这行数提示好像有点不准。
有可能是调用blit_alpha函数传参给location参数的实参类型不对。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-9 06:22:30 | 显示全部楼层
hrpzcf 发表于 2022-7-8 21:51
报错说第51行,对type类型的数据使用下标取值了。

它这行数提示好像有点不准。

尝试在pycharm中执行,返回错误提示如下:

Traceback (most recent call last):
  File "D:/work/p16_5_pg_3_turtle.py", line 51, in <module>
    location: tuple[int, int],
TypeError: 'type' object is not subscriptable
libpng warning: iCCP: known incorrect sRGB profile


注意最后一行的提示。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-9 06:56:47 From FishC Mobile | 显示全部楼层
lzb1001 发表于 2022-7-9 06:22
尝试在pycharm中执行,返回错误提示如下:

Traceback (most recent call last):

百度一下,有解决方案的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-9 08:43:33 | 显示全部楼层
wp231957 发表于 2022-7-9 06:56
百度一下,有解决方案的

libpng warning: iCCP: known incorrect sRGB profile

---已百度找到解决方案

TypeError: 'type' object is not subscriptable

---找不到解决方案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-9 09:57:50 | 显示全部楼层    本楼为最佳答案   
这个问题严格来说不是TypeError而是版本问题。之前的回答中已经告诉你了,我使用了类型注释,类型注释从Python 3.2就已经引入了,之后也一直在不断变化。使用类型注释最大的好处是可以直接看清楚参数的类型,降低阅读代码难度,省去了猜测参数类型的麻烦。Python的类型注释这个特性非常好的一点是类型注释不是强制的,不是侵入式的,简单来说就是有它没它都可以运行。
解决问题最简单的办法就是删除报错的部分tuple[int, int],注意location后面的冒号也要删除。
如果还想保留这个类型注释就要做一些简单的修改,首先在代码开头写上from typing import Tuple(typing是负责类型标注的标准库,不用下载),然后把出错的部分tuple[int, int]改成Tuple[int, int]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-9 10:16:43 | 显示全部楼层
location: tuple[int, int], 这句你是要实现什么功能?代码是复制来的还是你写的?

指定数据类型可以:
location: (int, int),
location: [int, int],
location: tuple([int, int]),
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-9 10:51:11 From FishC Mobile | 显示全部楼层
lzb1001 发表于 2022-7-9 06:22
尝试在pycharm中执行,返回错误提示如下:

Traceback (most recent call last):

参考6楼,
from typing import Tuple
下面改成location: Tuple[int, int]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-9 10:56:32 | 显示全部楼层
ba21 发表于 2022-7-9 10:16
location: tuple, 这句你是要实现什么功能?代码是复制来的还是你写的?

指定数据类型可以:

location: tuple[int, int]这种写法叫做类型注释,用于说明参数的类型。具体来说就是location接受由两个整数组成的元组作为参数,例如(1, 2)可以,但是("a", "b")不可以。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-9 11:28:14 | 显示全部楼层
Brick_Porter 发表于 2022-7-9 10:56
location: tuple这种写法叫做类型注释,用于说明参数的类型。具体来说就是location接受由两个整数组成的 ...


是的,我也是这么觉得他要实现(例如(1, 2)可以,但是("a", "b")不可以。),或是指示该参数为一个tuple类型。
事实上 函数注释:它的作用仅仅是为了函数进行注释来用,并不能指定参数类型。,所以 location:"是一个字符串说明",当然你放个类型到这里也不会有问题 如:
location:"是一个字符串说明" == location:str

代码验证:
def test(t: int):
    print('内:',id(t))
    print(t)


a = 'b'
print('外:',id(a))

test('af')
def test(
        t: (int, int),
) -> None:
    print('内:',id(t))
    print(t[0], t[1])


a = ('a','1')
print('外:',id(a))

test(a)
from typing import Tuple


def test(
        t: Tuple[int, int],
) -> None:
    print('内:',id(t))
    print(t[0], t[1])


a = ('a','1')
print('外:',id(a))

test(a)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-9 12:13:32 | 显示全部楼层
ba21 发表于 2022-7-9 11:28
是的,我也是这么觉得他要实现(例如(1, 2)可以,但是("a", "b")不可以。),或是指示该参数为一个tupl ...

你的解释是对的,只有使用第三方库mypy这种才会进行静态类型检查,否则就仅作注释使用。
至于说代码验证部分,Python 3.9以后的版本中可以直接用list、tuple、dict等内置数据类型做类型注释,之前的版本还是得按照你的写法from typing import List, Tuple, Dict等等
Python 3.11还在typing中新增了Self,解决了没法注释返回值是自身同类型的情况
另外Python官方也有意在未来废弃typeing.Dict, typing.List, typing.Tuple这种写法,转而直接使用内置类型进行标注
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-28 18:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表