如何调用Javascript中的Python函数
如果我这样做,就可以了:如何调用Javascript中的Python函数,javascript,python,variables,Javascript,Python,Variables,如果我这样做,就可以了: 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
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
这不是很简单,所以我是这样做的:
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():
^
文件“c.py”,第16行,在
()
文件“c.py”,第13行,a
c=评估(d)
文件“”,第2行
def d():
^
那我该怎么办
感谢分享您可以使用对象的变量。定义将用作数据容器的某个类。看起来您想将
a
变成一个类:
class A(object):
b = [1,2,3]
def d():
print b
A.d()
A.b = [4, 5, 6]
A.d()
您可能会被javascript的作用域(与python相反)弄糊涂。在继续之前,请阅读官方Python教程中的内容!你可能也会发现Ian Bicking的演讲很有用:。他在研究两种语言之间的差异方面做得很好 在本例中,您尝试使用在另一个函数的命名空间中定义的名称访问对象,这意味着它无法了解该名称。理想的做法是重写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的名称空间/范围相当直观。如果没有看到您试图模拟的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
关键字将是另一种(不太可取的)方式。您想做什么?听起来你在做任何事情,你在做的事情都非常倒退。您有一些代码需要共享一些数据。甚至,您有一些数据需要对其执行某些操作。要是发明了面向对象编程就好了…