推荐学习书目
› 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
yxslnmp
V2EX  ›  Python

py 的字符串拼接是不是有点反人类啊

  •  
  •   yxslnmp · Mar 17, 2017 · 8558 views
    This topic created in 3522 days ago, the information mentioned may be changed or developed.
    一个 url : http://www.xxx.xxx/search/user + '/' +id , id 为 int 型,结果报错,本来打算用 join 的,发现 join 函数也不允许连接一个 int 型
    我主要写 PHP 的。换 py 写感觉好不适应
    75 replies  •  2017-03-20 23:51:40 +08:00
    upczww
    upczww
    Mar 17, 2017 via iPhone
    1
    str(id)
    devzero
    devzero
    Mar 17, 2017 via Android
    2
    url 是 str 型的,拼接要类型相同吧
    swulling
    swulling
    Mar 17, 2017 via iPhone
    3
    请用 str.format
    jasontse
    jasontse
    Mar 17, 2017 via iPad
    4
    强类型的差别,感觉又要吵了。。。。
    kaka826
    kaka826
    Mar 17, 2017
    5
    eastpiger
    eastpiger
    Mar 17, 2017❤️1
    6
    字符串拼接都是推荐"".format()来做的吧
    imn1
    imn1
    Mar 17, 2017
    7
    这个要看人类怎么定义
    yxslnmp
    yxslnmp
    OP
    Mar 17, 2017
    8
    @upczww
    @devzero
    @swulling
    @jasontse
    @kaka826
    @eastpiger
    感谢各位解答。。直接 str()了,写了几个月吐槽点越来越多。
    比如用 peewee 库, get 一个不存在的数据会报错,还非要 try 捕捉下, PHP 里就没有这么多蛋疼的地方
    希望随着时间的推移让我爱上 py 交易吧
    wevsty
    wevsty
    Mar 17, 2017
    9
    py 这也算蛋疼的话,那 C++之类只能哭晕在厕所了
    liujinlingchn
    liujinlingchn
    Mar 17, 2017❤️3
    10
    我曹, 还敢有 python 反人类的
    拉出去
    dishonest
    dishonest
    Mar 17, 2017
    11
    @yxslnmp 这个不是 python 的锅吧
    peewee 我没用过,如果你用 django 的 ORM , get 仍然会报错,但是用 first 就不会。
    这个取决于你的需求,如果这是一个意料之外的,比如不合法访问,那么报错保护了数据,直接结束整个流程,是完全正确的;反之如果处理不存在的情况也是一种业务上的需求,你可以 try ,也可以用 first 再去处理 first 的返回值。
    kindjeff
    kindjeff
    Mar 17, 2017
    12
    其实这个字符串拼接不自动转还是有好处的!

    ——以前用 flv.js 视频时间显示不出来,慢慢找发现我给的数字其实是字符串型,它用+号加起来的时候全部变成了巨长的数字。
    scriptkid
    scriptkid
    Mar 17, 2017
    13
    各有各的蛋疼之处,主要看你习惯罢了
    python 这样的语言你都觉得反人类,那我还有什么话说
    dishonest
    dishonest
    Mar 17, 2017
    14
    @yxslnmp 如果 PHP 不报错,那空值直接进入下面的业务,产生无法控制的 bug ,这个才是真反人类
    mutoulbj
    mutoulbj
    Mar 17, 2017
    15
    如果 get 不报错,那你想获得什么结果呢
    yxslnmp
    yxslnmp
    OP
    Mar 17, 2017
    16
    @imn1 #7
    @dishonest #14
    @scriptkid #13
    @kindjeff #12
    @dishonest #11
    @liujinlingchn #10
    @wevsty #9

    我知道错了,主要刚过来写没多久,保留了很多 PHP 的习惯,各位打住,避免引起不必要的战争
    maomaomao001
    maomaomao001
    Mar 17, 2017 via Android
    17
    没有模板字符串也就算了,字符串拼接居然不会自动转换类型。。。。
    jkneedout
    jkneedout
    Mar 17, 2017 via iPhone
    18
    用 c 语言的表示很淡定
    Ge4Los
    Ge4Los
    Mar 17, 2017
    19
    字符串拼接居然用 + 。
    不用 format 也可以 % 来拼接啊。
    另外 peewee get 不到的话,还有 get_object_or_404() 的方法。
    LZ 还是多看看文档吧
    GuestID
    GuestID
    Mar 17, 2017
    20
    就算报错,也会和你清清楚楚的说是类型错误啊。。
    Hstar
    Hstar
    Mar 17, 2017
    21
    简单拼接比较习惯 'http://www.xxx.xxx/search/user/%d' % id 这样写
    eason622
    eason622
    Mar 17, 2017 via iPhone
    22
    用 format()岂不是美滋滋
    yxslnmp
    yxslnmp
    OP
    Mar 17, 2017
    23
    @Ge4Los #19 懒得用%,在 php 中简单的我一直是+来拼接

    @imn1 #7
    @Hstar
    @GuestID #20
    @Hstar #21
    @jkneedout #18
    @maomaomao001 #17
    @mutoulbj #15

    感谢各位热心解答,想不到一个小小的话题这么多人回复,小弟受宠若惊啊。

    后来人打住吧,此贴作废。下班回家
    yxslnmp
    yxslnmp
    OP
    Mar 17, 2017
    24
    @eason622 #22 php 也有 format...我嫌麻烦,就这么简单的一个拼接。换的着上意大利炮吗

    好了不多说了,各位散了
    syahd
    syahd
    Mar 17, 2017 via Android
    25
    推荐用 join ,性能比+高很多
    nicevar
    nicevar
    Mar 17, 2017❤️1
    26
    所以学编程从复杂的语言开始也有好处, c++用多了觉得其他语言怎么折腾也能接受,用 kotlin 踩了一段时间坑之后觉得太爽了
    shalk
    shalk
    Mar 17, 2017
    27
    用 perl 的时候,觉得类型随便用啊, 上下文自己感受,php 也是借鉴过来的
    kghch
    kghch
    Mar 17, 2017
    28
    大概是还不适应吧,平心而论 python 是写起来最符合审美的语言,说到反人类,怎么没有 java
    billlee
    billlee
    Mar 17, 2017
    29
    还好你用的不是 C.
    C0VN
    C0VN
    Mar 17, 2017
    30
    还好你不是用的静态类型的语言,要不然你可以去自杀了。
    palmers
    palmers
    Mar 17, 2017
    31
    @kghch 怎么说 java 了 类似 java 这种高级语言 更接近生活 怎么反人类了? 反人类的都是底层语言
    est
    est
    Mar 17, 2017
    32
    《 python 的 orm 是不是有点反人类啊》

    居然不能 "select * from table where a=" + 1
    fy
    fy
    Mar 17, 2017
    33
    @maomaomao001
    1. 模板字符串 3.6 有了, f-string ,现在生产环境是 3.5 , 3.6 并不遥远

    2. 字符串拼接自动转换类型?到时候又会来喷 1 + '1' = '11' 了
    springmarker
    springmarker
    Mar 17, 2017
    34
    这个 xxx.xxx 域名点开后很。。。。嗯。。。。。
    zhustec
    zhustec
    Mar 17, 2017 via Android
    35
    @liujinlingchn
    Python 本来就很反直觉啊
    icedx
    icedx
    Mar 17, 2017
    36
    Python 是强类型语言啊
    phrack
    phrack
    Mar 17, 2017 via Android
    37
    换语言不适应就是依然是以前语言的思维习惯问题而已,多用用就自然而然了。

    还记得用 c 换 py 的时候也有一两个月不适应。
    foo2bar
    foo2bar
    Mar 17, 2017
    38
    python 下的字符串拼接很好用啊
    url = 'http://www.xxx.xxx/search/user/%d' %id
    PythonAnswer
    PythonAnswer
    Mar 17, 2017
    39
    用+是 js 党的习惯啊,哈哈哈
    yunji3344
    yunji3344
    Mar 17, 2017
    40
    同感
    WispZhan
    WispZhan
    Mar 17, 2017
    41
    看来是需要探讨一下“第一个语言是 c/c++的重要性”。
    think2011
    think2011
    Mar 17, 2017
    42
    ` http://www.xxx.xxx/search/user${id}` 觉得 js 的最好用, 'http://www.xxx.xxx/search/user/%d' %id 也还行
    bombless
    bombless
    Mar 17, 2017 via Android
    43
    确实,还不如 cpp ,隐式转换都没法做(逃

    不过格式化字符串用从一串模板字符串出发其实也算是标准做法
    likuku
    likuku
    Mar 17, 2017
    44
    果然 PHPer 的代码习惯够糟糕的哎...
    102400
    102400
    Mar 17, 2017❤️1
    45
    与 py 交易不如和 ruby
    "http://www.xxx.xxx/search/user/#{id}"
    likuku
    likuku
    Mar 17, 2017
    46
    @PythonAnswer 哦?+ 是 JS 习惯?今天才知道...

    我当初直接 py 上手,开始用 + 好多年,最近两年才慢慢换成 %类型 嵌入字符串里,末尾再加个 变量列表。
    limbo0
    limbo0
    Mar 17, 2017
    47
    lz 只会 php 吗
    freestyle
    freestyle
    Mar 18, 2017
    48
    这是强类型语言 不自动转型的 花式 format 很好用的 'http://www.xxx.xxx/search/user/{}',format(id)
    Miy4mori
    Miy4mori
    Mar 18, 2017 via iPhone
    49
    你在 v2 吐槽 py 不是找不自在吗?😂😂😂
    uucloud
    uucloud
    Mar 18, 2017
    50
    你随便找本新手教程看一遍再用。。省时间
    RqPS6rhmP3Nyn3Tm
    RqPS6rhmP3Nyn3Tm
    Mar 18, 2017 via iPhone
    51
    动态类型一时爽……
    写 PHP 我感觉是没有 py 爽
    PythonAnswer
    PythonAnswer
    Mar 18, 2017
    52
    @likuku `%` 是淘汰的方法了,社区前阵子推荐 `str.format()`

    3.6 以后可以用这个

    ```python
    >>> f'The value is {value}.'
    'The value is 80.'
    ```
    andyiac
    andyiac
    Mar 18, 2017
    53
    习惯就好
    XYxe
    XYxe
    Mar 18, 2017❤️1
    54
    以 CPython 2.7.11 为例,在 Objects/stringobject.c 文件的 string_concat 函数开头加上:

    ```
    if(!PyString_Check(bb) && bb->ob_type->tp_str != NULL)
    {
    PyObject *nbb = bb->ob_type->tp_str(bb);
    return string_concat(a, nbb);
    }
    ```
    然后就:

    junnplus
    junnplus
    Mar 18, 2017
    55
    @XYxe 233333
    fengfisher2
    fengfisher2
    Mar 18, 2017
    56
    是 python2.x 还是 3.x ?
    我觉得 python 的已很人性化了。
    precisi0nux
    precisi0nux
    Mar 18, 2017 via iPhone
    57
    楼主一定是个假 php dev , php 里 string concatenation 明明是 '.'
    wangjie
    wangjie
    Mar 18, 2017
    58
    可以试试写 node
    pynix
    pynix
    Mar 18, 2017
    59
    坐等 3.6
    fuxkcsdn
    fuxkcsdn
    Mar 18, 2017
    60
    @xavierskip 静态类型语言反而不觉得
    正因为 python 和 js 和 php 一样是弱类型的语言,所以想当然会觉得
    str + int 应该自动转换成 str + str ,还特地 str + str(int) 确实很蛋疼

    P.S. 用 python 三个礼拜有感
    wildplant
    wildplant
    Mar 18, 2017
    61
    楼主开了喷语言的贴,是说打住就能打住的吗?不翻页已经算好了。
    billwsy
    billwsy
    Mar 18, 2017
    62
    我觉得真正要吐槽的是运行到那一句才报错吧,要是 Python 静态类型多好
    dant
    dant
    Mar 18, 2017
    63
    @fuxkcsdn Python 是强类型+动态类型
    exoticknight
    exoticknight
    Mar 18, 2017
    64
    重要的是在 python 下拼接字符串就不应该用 +
    不同语言要分开对待
    exoticknight
    exoticknight
    Mar 18, 2017
    65
    另外我记得 php 的拼接更奇葩吧,好像是用.
    vicalloy
    vicalloy
    Mar 18, 2017 via iPhone
    66
    如果真打算用一种新语言,应当找本书仔细看看,可以少很多坑,花不了几天时间。
    你的问题都是最基础的东西,看过书都知道。另外你是在有 PHP 的思维写 python ,自然不爽。
    第一个问题是因为类型不匹配。实际上 PHP 和 js 的自动类型转换很可能带来潜在的问题。
    第二个问题,你给个默认值就不会抛错。
    C0VN
    C0VN
    Mar 18, 2017
    67
    @fuxkcsdn #60 Python 应该是强类型, js 是弱类型。

    弱类型语言是指变量的类型可以被隐式转换。而强类型语言趋向于不自动转换变量类型,转换类型需要手动进行。

    https://www.v2ex.com/t/61513

    https://www.zhihu.com/question/19918532
    neoblackcap
    neoblackcap
    Mar 18, 2017
    68
    @whwq2012 其实少量拼接的时候+跟 join 的性能相差不大。
    msg7086
    msg7086
    Mar 18, 2017
    69
    #23 @yxslnmp 你一定是用了假的 PHP 。
    我写 PHP 的时候都是要用 . 来拼接的,你怎么会用 + 的?
    freestyle
    freestyle
    Mar 18, 2017 via iPhone
    70
    其实 lz 是来黑 php 用.连接字符的 (doge
    jhdxr
    jhdxr
    Mar 18, 2017
    71
    @yxslnmp 写了这么多年 PHP 我到现在才知道 php 能用+连接字符串,但怎么感觉连完的结果不大对呢→_→
    hoyixi
    hoyixi
    Mar 18, 2017
    72
    那你用 Swift 岂不是要砸电脑,嘿嘿
    liuzhiyong
    liuzhiyong
    Mar 19, 2017 via iPad
    73
    Python 和 php 是不同的编程语言啦,相信楼主很快就能适应。
    JerryZhang
    JerryZhang
    Mar 20, 2017
    74
    Python 反人类的又不只这一个,何必大惊小怪的。
    Chyroc
    Chyroc
    Mar 20, 2017
    75
    3.6 f-string:

    `f'http://www.xxx.xxx/search/user/{id}'`
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1683 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 407ms · UTC 11:17 · PVG 19:17 · LAX 03:17 · JFK 06:17
    ♥ Do have faith in what you're doing.