V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
AbcHiyi
V2EX  ›  Python

发现了 Python 一个奇怪的特性

  •  
  •   AbcHiyi · 2020-11-05 23:52:38 +08:00 · 4193 次点击
    这是一个创建于 1480 天前的主题,其中的信息可能已经有所发展或是发生改变。

    正常来说使用 bool 函数判读一个自定义的对象只要对象没有实现 bool 方法因该是默认作为 true 处理的吧。 但是奇怪的是在 3.8.5 版本中我自定义的一个对象在某些情况下作为 true 某些情况下作为 false 处理,但是我确定没有实现__bool__方法.这让我很费解。仔细观察发现,这个对象含有有效数据时作为 true 处理,不含有时作为 false 。这让我很费解。调用数据有关的至于两个方法,一个 json 方法,一个 text 方法。在 josn 在任何情况下都不会输出 None,text 方法在某些情况下会输出空字符串。但是测试后发现与这两个方法没有关系。实在不明白究竟是哪里出了差错。

    16 条回复    2020-11-10 20:59:33 +08:00
    askfermi
        1
    askfermi  
       2020-11-05 23:54:56 +08:00   ❤️ 2
    When this method is not defined, __len__() is called, if it is defined, and the object is considered true if its result is nonzero. If a class defines neither __len__() nor __bool__(), all its instances are considered true.

    https://docs.python.org/3/reference/datamodel.html#object.__bool__
    AbcHiyi
        2
    AbcHiyi  
    OP
       2020-11-06 00:01:13 +08:00
    @askfermi 这就是问题所在了,我既没有定义 __bool__方法也没有定义__len__方法,也没有定义别的东西。也许是其它问题。
    mec
        3
    mec  
       2020-11-06 00:04:47 +08:00 via iPhone
    贴代码呀
    Kobayashi
        4
    Kobayashi  
       2020-11-06 00:10:41 +08:00 via Android
    @mec 贴啥代码啊。大家盲赌,人人都有机会,岂不美哉?
    freakxx
        5
    freakxx  
       2020-11-06 01:45:59 +08:00
    先吐槽下,像这样的排版和问问题的手法,我看到了一些些喂我吃屎的同事的身影。
    出错了,既不给 request,也不给 response,也不给细节。

    可以看下是不是继承了基础类型,比如 str, 导致空值的时候为 False
    比如这样写
    class Value(str)
    laike9m
        6
    laike9m  
       2020-11-06 01:59:11 +08:00 via Android
    贴代码,请
    AbcHiyi
        7
    AbcHiyi  
    OP
       2020-11-06 03:42:06 +08:00
    @Kobayashi @laike9m @askfermi @freakxx 抱歉抱歉 忘记了 大概是这样的 没有继承

    class Semantic:

    @equal_language_check
    def __init__(self, from_lang, to_lang, reper_text):
    self.reper_text = reper_text
    self.from_lang = from_lang
    self.to_lang = to_lang

    template = Conf().template_of_semantic(
    fromlang=from_lang,
    text=reper_text,
    tolang=to_lang,
    )

    self.__data__ = requests.post(
    **template
    ).json()[0]['translations']

    def __repr__(self):
    return F'"{self.reper_text}"({self.from_lang})-->({self.to_lang})'

    def text(self) -> str:
    data = self.json()['semantic']
    text = '\n'.join([F'{k}:{",".join(v)}' for k, v in data.items()])
    return text

    def json(self) -> dict:
    semantics = {}
    for i in self.__data__:
    temp = []
    for i_i in i['backTranslations']:
    temp.append(i_i['displayText'])
    semantics[i['displayTarget']] = temp
    return {
    'from': self.from_lang,
    'semantic': semantics,
    'to': self.to_lang
    }
    AbcHiyi
        8
    AbcHiyi  
    OP
       2020-11-06 03:44:55 +08:00
    class Semantic:

    @equal_language_check
    def __init__(self, from_lang, to_lang, reper_text):

    def __repr__(self):

    def text(self) -> str:

    def json(self) -> dict:

    这好像没法弄格式,大致结构就是这样的
    ericls
        9
    ericls  
       2020-11-06 04:30:14 +08:00 via iPhone
    Python 很动态 anything is accessible at any time. 你得贴完整的代码
    catxo
        10
    catxo  
       2020-11-06 09:53:44 +08:00
    text 返回空字符
    那应该去检查 self.json()['semantic'] 是不是空
    所以应该检查 self.__data__是不是空
    所以应该检查 requests.post 返回什么东西
    从头到尾跟 dunder method 都没有关系
    zone10
        11
    zone10  
       2020-11-06 09:56:41 +08:00
    问题的附录可以用 markdown 格式的, 怕你不知道跟你提一嘴, 没排版好的代码就懒得看了
    freakxx
        12
    freakxx  
       2020-11-06 13:16:52 +08:00
    @zone10 #11
    这样的口气,显得你能?
    freakxx
        13
    freakxx  
       2020-11-06 13:19:06 +08:00
    @AbcHiyi #8

    感觉没办法判断出问题,

    你可以看两个地方
    一个是 equal_language_check 这里有没写了什么,可能做了一些属性的操作
    另外就是在对象输出的地方,看下__dir__ 是不是包含了 __bool__ 或 __len__ 这样的方法
    zone10
        14
    zone10  
       2020-11-09 09:54:57 +08:00
    @freakxx 贴代码要排好版是程序员的基本素养, 对大家都好, 当然你不在乎困难乐于助人当我没说
    JSPIXiaoHei
        15
    JSPIXiaoHei  
       2020-11-09 20:35:54 +08:00
    写个测试,传一堆东西进去,看看到底哪个不一样,然后再调试跟进,看看问题出在哪
    AbcHiyi
        16
    AbcHiyi  
    OP
       2020-11-10 20:59:33 +08:00
    @zone10 好的知道了,下次注意。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3200 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:17 · PVG 21:17 · LAX 05:17 · JFK 08:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.