• 请不要在回答技术问题时复制粘贴 AI 生成的内容
shijingshijing
V2EX  ›  程序员

如何尽量增加 Python 代码行数,在不改变功能的前提下,代码尽量复杂化

  •  1
     
  •   shijingshijing · Nov 30, 2023 · 19660 views
    This topic created in 1069 days ago, the information mentioned may be changed or developed.

    RT ,帮朋友问的,他 6 月毕业一直空档,现在好容易找了个传统公司,偏制造业的那种,开发就几个人,老板定 KPI 主要是看代码行数和文档字数。老板的思路是,我提一个功能,朋友帮他实现,然后按代码行数来算这个功能的复杂程度和绩效。老板虽然不懂编程,但是还是很精明的,会给让他们自己排期,定节点,然后评审。项目开始和结束的时候,都会找他懂技术的朋友帮忙看一下。

    他们老板和老板的朋友不傻,所以塞注释那种肯定是不行的。我帮他在网上找了一堆 Python 代码混淆的工具,Pyobfuscate 那种把函数名改成 lllllll 的,肯定也不行。但评审也不会太深入,塞点无效代码应该是可以的,就是太费脑子了。

    目前我和他两个臭皮匠总结了下面几个可行的方法:
    1 ,所有变量都尽量单独显式定义并赋值,美其名曰初始化。
    2 ,能不写在一行的,尽量不写在一行。
    3 ,能封装成函数的,尽量封装成函数,既增加行数,还增加复杂度。
    4 ,tkinter 写的窗口什么的,即使是有默认值,也单独拿出来重新赋值一下。

    效果也是有的,一个 200 多行的 Python 脚本干到了 500 行,但是还是不够,朋友的意思是,最好是随着老板提出的功能线性增加,这样符合他的预期。大家还有什么好办法,集思广益,帮帮他。

    Supplement 1  ·  Dec 1, 2023
    建议提桶跑路和劝老板改 KPI 标准明显行不通的,现在工作市场什么情况大家都清楚,朋友大龄码农,6 月空档到现在,这个工作他当然也不满意,上有老下有小,有些事情也是身不由己,还是说点现实的吧。

    还有,这个也不算什么道德违规吧,保证功能完整,满足老板需求,自己利益最大化,没什么不对。道德上比那些搞医疗广告、App 偷个人隐私的还是高不少。
    102 replies  •  2023-12-02 11:00:58 +08:00
    1  2  
    ❮ ❯
    hangbale
    hangbale
    Nov 30, 2023❤️2
    1
    轮子全部自己造
    maybedk
    maybedk
    Nov 30, 2023
    2
    你不如把 import 的包都重新实现一下
    ModStart
    ModStart
    Nov 30, 2023❤️24
    3
    不要用库,把库代码都拷贝进来重写一遍
    darkengine
    darkengine
    Nov 30, 2023❤️6
    4
    把循环人工展开 。。。
    ljsh093
    ljsh093
    Nov 30, 2023❤️2
    5
    @darkengine #4 你这个最逆天
    vvvVictoria
    vvvVictoria
    Nov 30, 2023❤️43
    6
    《按代码行数来算这个功能的复杂程度和绩效》
    《他们老板和老板的朋友不傻》
    roundgis
    roundgis
    Nov 30, 2023 via Android
    7
    換 java
    jrtzxh020
    jrtzxh020
    Nov 30, 2023
    8
    老板的思路是,我提一个功能,朋友帮他实现。。。 都实现了,为什么还需要你朋友开发???
    coderwink
    coderwink
    Nov 30, 2023
    9
    阿里系出来的吧
    chuckzhou
    chuckzhou
    Nov 30, 2023❤️3
    10
    有这功夫不如多学点东西,提高自己换更好的工作,否则只能在这种 low 逼公司过一辈子了。
    iorilu
    iorilu
    Nov 30, 2023❤️2
    11
    有个好方法, 你搜下 cython , 可以将 python 转为 c 代码模块, 然后 python 程序照样调用, 不用改

    结果就是 100 行变几千行 c 代码
    wumou
    wumou
    Nov 30, 2023
    12
    多写一些不会被调用的方法
    krixaar
    krixaar
    Nov 30, 2023
    13
    有需要存储数据和配置的需求的话,往数据库里写(本地就 sqlite 啥的),哪怕存个按钮状态,都用 SQL 操作,不要 context manager ,存个东西取个东西一堆 connect/cursor/prepared statement/close ,建库无限追求三范式,取个数据 join 一堆一个 join 一行,不搞成一个函数全部复制粘贴 DO Repeat Yourself 也是 DRY 原则
    Narcissu5
    Narcissu5
    Nov 30, 2023
    14
    #1 正解,不使用任何第三方库,排序都自己写
    raycool
    raycool
    Nov 30, 2023
    15
    这个问 GPT4 ,对于写好的函数让 gpt4 增加行数
    tf2
    tf2
    Nov 30, 2023
    16
    那还说啥?用库啊。直接 vendor 到项目里。时不时还改一下库的内部实现。
    gxy2825
    gxy2825
    Nov 30, 2023
    17
    #1 +1 ,能造轮子绝不用现成的轮子,问就是效率更高
    cambria
    cambria
    Nov 30, 2023❤️6
    18
    Python ?在每一个函数里增加足够多的数据校验和异常处理,任谁都挑不出毛病。
    masterclock
    masterclock
    Nov 30, 2023
    19
    2 楼正解
    Sezxy
    Sezxy
    Nov 30, 2023
    20
    调用每个方法都加个 try expect 包裹
    SenLief
    SenLief
    Nov 30, 2023
    21
    这个很容易啊,把包重新实现一下就好了。
    zhixi
    zhixi
    Nov 30, 2023❤️3
    22
    @Goooooos 那我觉得不如直接学某大道至简的语言,直接扔上去满屏的

    err := xxxxxx
    if err != nil {

    }
    arthurblake
    arthurblake
    Nov 30, 2023
    23
    @jrtzxh020 #8 这里的’朋友‘是指 up 主的朋友,而非老板的朋友
    secpool
    secpool
    Nov 30, 2023
    24
    我能说我才帮老板写了脚本 统计 gitlab 所有人的代码提交量吗?😂
    weiwenhao
    weiwenhao
    Nov 30, 2023
    25
    我最近写 golang 就想到这个问题,如果统计代码行数,golang 绝对是最多的。if err + log 至少占了代码量的一半。

    写 python 也可以,方法的开始写个 log, 结束写个 log, 每个 if 里面也写个 log 这样也可以增加代码行数。
    Rebron1900
    Rebron1900
    Nov 30, 2023
    26
    @iorilu 好家伙,指了条明路
    Kinnice
    Kinnice
    Nov 30, 2023
    27
    每一个函数都实现单独一个 class , class 中把所有的魔法函数都 rewrite 一下,最少也得打个日志之类的。
    使用的 的时候必须 x = funcClass() x.init() x.func() x.clean() x.exit()
    ZXiangQAQ
    ZXiangQAQ
    Nov 30, 2023
    28
    @zhixi 好思路,err 处理时顺便打印下日志,日志使用结构化,然后每个属性单独起一行,绝对够行数,类似
    jianchang512
    jianchang512
    Nov 30, 2023
    29
    1. 把用到的内置函数都统统再封装一层
    2. 写一堆用不到的复杂算法
    3. 能用 if 就不要用 for while
    killva4624
    killva4624
    Nov 30, 2023❤️1
    30
    我贡献一个思路:把 lint 工具的每行最大长度减少,比如 PEP 是 79 ,改成 70 或者 65 ,甚至 50
    param
    param
    Nov 30, 2023 via Android❤️1
    31
    所有入参都判断一下类型,不对就抛异常
    littlewing
    littlewing
    Nov 30, 2023
    32
    离职
    Chuckle
    Chuckle
    Nov 30, 2023
    33
    库拿出来二次封装很合理吧,瞬间代码量就爆炸了
    louisxxx
    louisxxx
    Nov 30, 2023
    34
    if record['name'] in ["zhang", "liu", "wang", "wu", "le", "liu"]:
    a = a +1

    改成

    if record['name'] == 'zhang':
    a = a + 1
    if record['name'] == 'liu':
    a = a + 1
    if record['name'] == 'wang':
    a = a + 1
    if record['name'] == 'wu':
    a = a + 1
    if record['name'] == 'le':
    a = a + 1
    if record['name'] == 'liu':
    a = a + 1
    mylifcc
    mylifcc
    Nov 30, 2023
    35
    上 pydantic 写几个元类就行了
    iOCZS
    iOCZS
    Nov 30, 2023
    36
    不要以身犯险,有违职业道德,待遇觉得不行,你可以干一段时间跑路。但是务必做好自己的本职工作。
    thinkm
    thinkm
    Nov 30, 2023
    37
    不要用循环
    Bigscience
    Bigscience
    Nov 30, 2023
    38
    建议换老板
    自己人为故意地堆答辩代码,损人害己,建议远离这种不合理的绩效规则
    llsquaer
    llsquaer
    Nov 30, 2023
    39
    import 的库都是深度封装的。你就拆散,按照需要的内容自己封装一次。。即阅读了源码,也自己实现了一遍简易功能,还令老板开心,简直三丰收。

    第二种,GitHub 上随便抄几百行代码,copy 到自己项目里。然后加一个 try....。为了 IDE 乱标红,就对应的在前面加一些变量初始化下。完美解决。
    test0x01
    test0x01
    Nov 30, 2023 via Android❤️4
    40
    各种 exeption 考虑周全,把 log 也多打一点。既不失水准,方便调试,又增加行数
    garipan
    garipan
    Dec 1, 2023
    41
    你这个需求,ChatGPT 4 应该可以完美满足
    corcre
    corcre
    Dec 1, 2023
    42
    老板怎么统计行数呢, 如果是在 git 那些工具统计的话自己写个格式化工具没事就改一下换行条件能显著提升代码更改行数🐶
    bianhui
    bianhui
    Dec 1, 2023
    43
    为了一个函数,把别人开源项目搬进来
    wangtian2020
    wangtian2020
    Dec 1, 2023
    44
    像我是总是忍不住把 JavaScript 写的尽可能短肯定忍不了,一天就跑路
    GBdG6clg2Jy17ua5
    GBdG6clg2Jy17ua5
    Dec 1, 2023
    45
    1.能不用第三方库就不用,自己写,自己实现
    2.多做防御性判断,异常处理能多完善就多完善
    3.多打 log
    4.多用设计模式,各种秀既能
    wangtian2020
    wangtian2020
    Dec 1, 2023
    46
    戒备心强到连开发人员不信任,搞乱七八糟的开会报告,肯定到时候有利润也不会分享给员工,员工当个可替换的工具人。生活只要给我留一口气,这样的公司我就不可能待的
    McZoden
    McZoden
    Dec 1, 2023
    47
    把所有的迭代器遍历,修改为 c 语音风格的 while ,i++
    例如:

    list = [1, 2, 3, 4, 5]
    for i in list: ...

    修改为

    i = 0
    while i < len(list):
    ...
    i += 1

    针对所有的可迭代对象:列表,字典,生成器
    isSamle
    isSamle
    Dec 1, 2023❤️3
    48
    1.把库拉下来本地自封装:美其名曰脱离网络/版本依赖
    2.所有的逻辑加上诸如“操作记录”,“访问 IP”,“权限判定”,“调用日志”之类的数据记录和管理:美其名曰增强安全管理
    3.命名使用全拼长蛇形链:美其名曰见名知意
    4.所有逻辑加上各种异常校验诸如“有无权限”,“调用是否正常”,“异常原因分类 401/402/403/404…”:美其名曰便于测试维护
    5.尽可能都去构造类,有无必要都再继承后复写相关变量/方法作为新的子类:美其名曰面向对象
    CodeCodeStudy
    CodeCodeStudy
    Dec 1, 2023
    49
    增加代码行数是 java 的看家本领,各种 getter, setter 就已经代码满天飞了
    tangtang369
    tangtang369
    Dec 1, 2023
    50
    所有功能都面向对象 用类封装 每个类的魔法方法(__init__,__new__,__del__,__str__,__repr__,__call__)统统来一遍
    adimn
    adimn
    Dec 1, 2023
    51
    简单, 用到的轮子, 把轮子源码都拷到项目里面,就成自己的了
    leaflxh
    leaflxh
    Dec 1, 2023
    52
    学 Java 的写法,类中变量的访问和赋值全用 getter 和 setter
    pangdundun996
    pangdundun996
    Dec 1, 2023
    53
    我的建议是准备跑路,不要在这种事上浪费生命
    chengdonghui
    chengdonghui
    Dec 1, 2023
    54
    糊弄了领导的同时,也糊弄了自己
    Crixs
    Crixs
    Dec 1, 2023
    55
    不引用第三方库,直接把第三方库的代码集成到代码中,这量不就起来了么
    43n5Z6GyW39943pj
    43n5Z6GyW39943pj
    Dec 1, 2023
    56
    跑路
    Alexsen
    Alexsen
    Dec 1, 2023
    57
    数据校验和异常处理,再打个日志
    F7TsdQL45E0jmoiG
    F7TsdQL45E0jmoiG
    Dec 1, 2023
    58
    典型的互相伤害
    ztxcccc
    ztxcccc
    Dec 1, 2023
    59
    @janwarlen #6 老板的朋友可能真不傻,而是不知道按行定 KPI
    Donahue
    Donahue
    Dec 1, 2023
    60
    换老板
    visper
    visper
    Dec 1, 2023
    62
    把现在的方法写成 class, 功能放 class 里面。抽象出 10 层继承,美其名曰为了以后的扩展性。每一层里面又可以复制一次这个每一个方法,然后改一点或者一些层的留空。
    crayygy
    crayygy
    Dec 1, 2023
    63
    一个孤僧独自归,关门闭户掩柴扉。
    半夜三更子时分,杜鹃谢豹啼子规。
    Rehtt
    Rehtt
    Dec 1, 2023
    64
    那我上周提交了 4w 行代码岂不是无敌🤣
    xz410236056
    xz410236056
    Dec 1, 2023
    65
    pip install 以后就禁用了,for 也禁用了。 当然这工作不要自己做,代码写完后扔 gpt 搞,顺便让他再改改
    stillsilly
    stillsilly
    Dec 1, 2023
    66
    3 ,能封装成函数的,尽量封装成函数,既增加行数,还增加复杂度。

    并不是。
    函数能更好地抽象,少暴露细节,降低复杂度。能减少重复代码,减少行数。
    同一个功能,我的代码量会比我的同事们的少很多,因为我有很多个简短的函数可以复用
    vagusss
    vagusss
    Dec 1, 2023
    67
    引用第三方库的时候, 把源码拷贝出来当成自己的代码,靠谱
    Felldeadbird
    Felldeadbird
    Dec 1, 2023
    68
    建议尽早提桶走人。趁着年轻换一个好点的技术公司更好。把写代码的心思放在这种奇葩事情上,职业生涯污点啊。

    楼上各位大佬的方案都可行。
    InDom
    InDom
    Dec 1, 2023
    69
    var name = 1
    改成

    class name {
    var name = 1
    func set (val) {
    name = val
    }
    func get(){
    return val

    }
    }
    virusdefender
    virusdefender
    Dec 1, 2023
    70
    写个 wrapper ,里面捕获异常,然后返回 (data, error)

    然后 if err is not None: xxx
    chinesehuazhou
    chinesehuazhou
    Dec 1, 2023 via Android
    71
    杀敌一千,自损八百。敷衍了老板,却污染了自己
    dnfQzjPBXtWmML
    dnfQzjPBXtWmML
    Dec 1, 2023
    72
    函数参数尽量改成*args, **kwargs
    xuanbg
    xuanbg
    Dec 1, 2023
    73
    最简单的做法就是复制开源库的代码。
    zypy333
    zypy333
    Dec 1, 2023
    74
    如果有类似的功能,不要复用代码,拷贝改一份,多来几遍就非常酸爽了
    jones2000
    jones2000
    Dec 1, 2023
    75
    把通用的方法,或函数, 或第三方的独立出来,封装成统一的一套函数。 项目开发完成以后,把源码里面的这些函数替换成源码就可以了。
    hlwjia
    hlwjia
    Dec 1, 2023
    76
    @darkengine hahhahahahah 这个太牛逼了
    hlwjia
    hlwjia
    Dec 1, 2023
    77
    @ModStart 这个其实挺好,顺便提升了自己的技术
    hlwjia
    hlwjia
    Dec 1, 2023
    78
    数据库自己实现一个
    dragondove
    dragondove
    Dec 1, 2023
    79
    年初的时候刚好某群举办了一个活动写九九乘法表,我把代码最长的那一位的源码放这里,供参考
    https://github.com/InvoluteHell/NineNineTable/blob/master/HisAtri/%E4%BD%86%E6%B1%82%E6%9C%80%E5%A4%A7.py
    当然,你也可以参考这个 java 版本的,自己定义类型,不过这个不够逆天
    https://github.com/InvoluteHell/NineNineTable/blob/master/Luorenmu/main.java
    如果你想要更加复杂,代码行数多的同时保证“企业级”质量,可以参考企业级 java hello world 编写样例
    https://github.com/Hello-World-EE/Java-Hello-World-Enterprise-Edition/tree/master/src/com/example
    aborigine
    aborigine
    Dec 1, 2023
    80
    过度封装以及重复造轮子
    rb6221
    rb6221
    Dec 1, 2023
    81
    不要用高阶语法,能写 if 都写 if ,不要用简化语法
    不要重用,本来可以重用的方法都直接拷贝一份出来
    多做判空,多做异常捕获,就算这里几行代码是 100%不为空,你也加个判空。这样也有好处是可以减少 bug ,而且提高了代码量
    vivisidea
    vivisidea
    Dec 1, 2023
    82
    说服老板不要用这种方式来搞,对双方都没意思
    可以找几个例子,去说明这种方式的不合理, 比如

    1. 本来可以调用一个库函数的,对比自己实现一遍
    2. 本来可以很简单的一个策略模式设计,对比写一大堆 if-else 实现
    hevi
    hevi
    Dec 1, 2023
    83
    何必浪费生命呢,去做些有意义的事情不好吗

    就为了讨好资本家吗
    echoyangjx
    echoyangjx
    Dec 1, 2023
    84
    6 哇
    knightgao2
    knightgao2
    Dec 1, 2023
    85
    换个不傻的老板
    aijam
    aijam
    Dec 1, 2023
    86
    提供一个思路: https://gist.github.com/lolzballs/2152bc0f31ee0286b722
    既不容易被抓,看起来还专业
    godall
    godall
    Dec 1, 2023
    87
    @aijam 哈哈完全正确,利用设计模式造一个 helloworld 实现类,看起来专业高大上,实际上就是狗屎!

    话说设计模式是不是就是脱裤子放屁? c/c++时代根本没有这个,自从 java 后就出现这坨屎了。
    shijingshijing
    shijingshijing
    OP
    Dec 1, 2023
    88
    目前看下来:
    1 ,多加 try... excep...是可行的,特别是涉及用户输入,文件访问,网络连接相关的功能,可以猛搞,而且显得专业,考虑周到。
    2 ,封装成 Class 也会大幅增加代码数量,但是感觉需要改动的地方可能有点多,后续如果老板有大功能,重构的话倒是可以考虑。
    3 ,适当自己造轮子这个已经弄过了,有部分输出 xml 就是 writeline 搞的,复杂的还是用标准库的 ElementTree ,程序复杂度有提升,估计后面接手的人看了会皱眉。

    大家继续集思广益,我弄好了一起 Append ,也给有类似需求的人参考。coders help coders.
    8bryo4p5qn758Dmv
    8bryo4p5qn758Dmv
    Dec 1, 2023
    89
    @hangbale #1 就是,标准库全部自己写一遍不就完了
    IsQian
    IsQian
    Dec 1, 2023
    90
    @aijam 这真的只是 helloworld 嘛。。。
    dbus
    dbus
    Dec 1, 2023
    91
    没写过 python ,不知道能不能加测试用例
    013231
    013231
    Dec 1, 2023
    92
    @godall 我怎么记得 GoF 的 Design Patterns 里用的就是 C++?
    leimao
    leimao
    Dec 1, 2023 via iPhone
    93
    @darkengine pragma unroll
    iosyyy
    iosyyy
    Dec 1, 2023
    94
    @hlwjia #77 抄代码不会提升你任何技术
    shyangs
    shyangs
    Dec 1, 2023
    95
    @godall
    @013231

    Advanced C++ Programming Styles and Idioms 初版年份 1991
    Design Patterns: Elements of Reusable Object-Oriented Software 初版年份 1994

    C++ 的設計模式出現的時間比 Java 早,笑嘻了.
    error451
    error451
    Dec 1, 2023
    96
    所有运算符,所有常用函数都是可以自己重写的。
    比如 * 自己用循环累加的方式重写
    len() 自己去计算数组大小
    各种排序函数全部自己写
    所有可以自动迭代的,都自己写迭代器
    所有装饰器都不要用, 自己写
    想 with 这种语法糖都不要用,自己写关闭

    什么包调用,函数调用根本不存在的, 每次都重新写一遍
    cutecore
    cutecore
    Dec 1, 2023
    97
    单元测试,设计模式
    jesusjiang
    jesusjiang
    Dec 1, 2023 via Android
    98
    建立离职,别害人!
    jesusjiang
    jesusjiang
    Dec 1, 2023 via Android
    99
    建议离职,别害人
    bill110100
    bill110100
    Dec 1, 2023
    100
    别太过分了,照着库,改改变量名,都抄进来就好了,这就能让代码量膨胀好几倍,别把老板当傻子。
    1  2  
    ❮ ❯
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4848 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 247ms · UTC 01:16 · PVG 09:16 · LAX 17:16 · JFK 20:16
    ♥ Do have faith in what you're doing.