将代码从bash移植到Python;重写功能

时间:2017-10-03 14:22:37

标签: python bash python-3.x

我喜欢bash中很酷的可能性,它允许我覆盖功能。为了提高平台兼容性,我想将相同的功能移植到python中,但我不知道它是如何完成的。这些脚本演示了bash中的函数覆盖:

mycoolscript.sh:

#!/bin/bash

function myCoolFunc() {
    echo "Executing default implementation of myCoolFunc"
}

somevar="hello"

customfile="./${1}.sh"

if [ -e "${customfile}" ]; then
    source "${customfile}"
fi

myCoolFunc

echo "current value of 'somevar:' ${somevar}"

foo.sh:

function myCoolFunc() {
    somevar="modified!"
    echo "Executing custom implementation of myCoolFunc"
}

执行不带任何参数的主脚本:

$ ./mycoolscript.sh
Executing default implementation of myCoolFunc
current value of 'somevar:' hello

使用' foo'执行主脚本作为论点:

$ ./mycoolscript.sh foo
Executing custom implementation of myCoolFunc
current value of 'somevar:' modified!

导入的脚本可能包含也可能不包含该功能的覆盖,它是可选的。另外,请注意覆盖函数如何修改主脚本中声明的变量。

如何在python中实现相同的功能?

1 个答案:

答案 0 :(得分:0)

您可以通过使用自己的实现覆盖现有方法定义来实现类似的功能,例如:

>>> import math
>>> old_sin = math.sin
>>> def new_sin(radians):
...   print "someone called sin"
...   return old_sin(radians)
...
>>> math.sin = new_sin
>>> math.sin(10)
someone called sin
-0.5440211108893699

您当然可以对自己的文件执行相同操作和/或仅在收到特殊参数时才使用它:

<强> lib.py

def func(a):
    return a

<强> test.py

import sys
import lib

def myfunc(a):
    return a + 1

if __name__ == '__main__':
    if len(sys.argv) > 1 and sys.argv[1] == 'foo':
        lib.func = myfunc
    print(lib.func(1))

<强>输出

>>> python test.py
1
>>> python test.py foo
2