如何像在Javascript中那样调用Python函数

How to call a Python function like in Javascript

本文关键字:调用 Python 函数 何像 Javascript      更新时间:2023-09-26

如果我这样做,那就没问题了:

def a():
    b = [1,2,3]
    def d():
        print b
    d()
a()

但是我有很多方法需要函数D,所以我不得不从函数A中定义它,但它显示错误:

def d():
    print b
def a():
    b = [1,2,3]
    d()
a()

错误:

  File "c.py", line 21, in <module>
    a()
  File "c.py", line 19, in a
    d()
  File "c.py", line 16, in d
    print b
NameError: global name 'b' is not defined
所以我

有很多不同的变量,比如不同函数中的b,所以我不想像这样发送变量:

def d(b1,b2,b3,b4,b5):
    print b1,b2,b3,b4,b5

这不是很简单,所以我这样做:

d = '
'''
def d():'n
    print b
'''
def a():
    b = [1,2,3]
    c = eval(d)
    c()
a() 

但它也显示错误:

  File "c.py", line 16, in <module>
    a()
  File "c.py", line 13, in a
    c = eval(d)
  File "<string>", line 2
    def d():
      ^

那我该怎么办,

谢谢

你可能会对javascript的范围感到困惑,这与python的作用域相反。在继续之前,请阅读官方 Python 教程对作用域和命名空间的看法!你可能还会发现 Ian Bicking 的演讲很有用:Javascript for People Who Know Python。他在涵盖两种语言之间的差异方面做得很好。

在这种情况下,您尝试访问具有在另一个函数的命名空间中定义的名称的对象,这意味着它无法知道它。理想的做法是重写 d(),使其接受参数并传递 b。你也可以使用 global 将 b 声明为全局,但你应该避免这种情况。

def d():
    print b # b is defined in a so it's only available in a's local namespace
def a():
    b = [1,2,3] 
    d() # if you rewrite d to accept an argument, you can pass it b and this will work

这样做:

def d(b): # accepts an argument now
    print b
def a():
    b = [1,2,3]
    d(b) # calls d with an argument of b

如果您想知道各种作用域中的名称是什么,可以这样做:

import __builtin__
def d():
    print dir(__builtin__) # built-in names
    print dir(globals()) # global names
    print dir(locals()) # local names, defined in d 

我想你会发现Python的命名空间/范围相当直观。

看起来你想把a变成一个类:

class A(object):
    b = [1,2,3]
    def d():
        print b
A.d()
A.b = [4, 5, 6]
A.d()

要共享变量,您可以使用对象。定义一些将用作数据容器的类。

没有看到你试图模拟的JavaScript,我只能猜测。

但是你为什么不直接b传递给d

def d(b):
    print b
def a():
    b = [1,2,3]
    d(b)
a()

或者,如果这不是一个选项,也许您可以将b声明为全局:

b = []
def d():
    print b
def a():
    global b
    b = [1,2,3]
    d()
a()

或者,也许您正在编写一个包装器,以便在调用每个函数之前始终执行某些操作。 在这种情况下,装饰器可以帮助:

def test(b):
    def t(f):
        def d():
            print b
            return f(b)
        return d
    return t
@test([1,2,3])
def a(b):
    pass
a()

只是为了修改 Mikel 和 zeekay 现有的好答案,这里是 JavaScript 的区别。你可能拥有的是:

function d() {
  print(b);
}
function a() {
  b = [1,2,3];
  d();
}

但是你在Python中得到的相当于这个:

function d() {
  print(b);
}
function a() {
  var b = [1,2,3];
  d();
}

(请注意第二个版本中的var b)。如果你了解 JavaScript,你就会明白其中的区别。正如所建议的那样,参数传递是更可取的方式。使用global关键字将是另一种(不太可取的)方法。