为什么出现“字符串未定义”的错误?

2 投票
1 回答
861 浏览
提问于 2025-04-18 03:58

我正在使用 Redis 对象映射器,当我尝试运行这段代码时:

from redis import *
from rom import util
from rom import *

util.set_connection_settings(host='localhost', db=7)
class User(Model):
    uName=String(required=True)
    password=String(required=True)
    thisId=(random.random()*100)


user=User(uName='pfleet',password='pass')
user.save()
#todo, save session ID
user2=User.get_by(uName='pfleet')

不知道为什么,当我运行这段代码时,出现了一个错误,提示“名称字符串未定义”,尽管我在输入代码时和 ROM(Redis 对象映射器)GitHub 页面上的在线示例完全一样。

1 个回答

1

感谢@univerio的评论,看来在python2.x中,String是通过from rom import *这种方式导入的,引用自文档说明

note:: this column type is only available in Python 2.x

而在python3.x中,你需要使用Text来代替。

class User(Model):
    uName=Text(required=True)
    password=Text(required=True)

顺便提一下,尽量不要使用from xxx import *这种通配符导入方式——这其实是个很糟糕的做法:

通配符导入(从 import *)应该避免,因为它让人不清楚当前命名空间里有哪些名字,这会让读代码的人和很多自动化工具感到困惑。通配符导入有一个可以辩护的使用场景,就是将内部接口作为公共API的一部分重新发布(例如,用可选加速模块中的定义覆盖一个纯Python实现的接口,但具体哪些定义会被覆盖事先并不知道)。

撰写回答