NameError:未定义全局名称'sock'

Rob*_*inJ 3 python scope global python-2.7

我在Main.py中定义了一个名为sock的套接字.从Main.py我导入Functions.py,其中有一个函数(或一个方法,dunno如何在Python中调用它们),称为sendMessage.在sendMessage中,我需要使用我在Main.py中定义的sock.我该怎么做呢?我已经尝试添加global sock到我的函数/方法,但没有效果.

Main.py

#! /usr/bin/env python

import sys 
import socket 
import string 
import os
import commands
import time
from config import *
from functies import *
from php import *

sock = socket.socket ()
sock.connect ((config['server']['host'], config['server']['poort']))

...
Run Code Online (Sandbox Code Playgroud)

Functions.py

#! /usr/bin/env python

def sendMessage (receiver, message):
    global sock
    sock.send ('PRIVMSG ' + ontvanger + ' :' + message + '\n')
Run Code Online (Sandbox Code Playgroud)

错误

Traceback (most recent call last):
  File "Main.py", line 68, in <module>
    sendMessage (receiver, config['nick'] + ' is here!')
  File "/home/robin/microPy/Functions.py", line 4, in sendMessage
    sock.send ('PRIVMSG ' + receiver + ' :' + message + '\n')
NameError: global name 'sock' is not defined
Run Code Online (Sandbox Code Playgroud)

phi*_*hag 6

Python中没有php风格的模块 - 全局变量.相反,让sendMessagesocket作为参数,如下所示:

# main.py
import socket
from functions import *

sock = socket.socket ()
sock.connect ((config['server']['host'], config['server']['poort']))
sendMessage (sock, receiver, config['nick'] + ' is here!')
Run Code Online (Sandbox Code Playgroud)

# functions.py ; not .php
def sendMessage(sock, receiver, message):
    sock.send ('PRIVMSG ' + ontvanger + ' :' + message + '\n')
Run Code Online (Sandbox Code Playgroud)

  • 相反,如果使用全局变量,[代码将变得一团糟](http://programmers.stackexchange.com/questions/37249/the-singleton-pattern).例如,如何扩展程序以使用多个套接字?如果你真的需要一个全局变量,你可以创建一个模块`myGlobal`并在那里分配它. (2认同)