2016-08-16 5 views
0

私は「黒い帽子パイソン」本に沿って、次のされていると私は、この特定のコードに入力されたとき、私はエラーを得たが、「グローバル名server_loop()が定義されていません」「グローバルな名前server_loop()が定義されていません」 。ここでステートメントがエラーを持つmain()関数の前にある:Pythonのエラー:

if listen: 
    server_loop() 

、ここでは、メイン()関数とserver_loop()関数です:

def server_loop(): 
global target 

# if no target is defined, we listen on all interfaces 
if (not len(target)): 
    target = "0.0.0.0" 

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server.bind((target, port)) 
server.listen(5) 

while True: 
    client_socket, addr = server.accept() 

    # spin off a thread to handle our new client 
    client_thread = threading.Thread(target=client_handler, args=(client_socket,)) 
    client_thread.start() 

おかげ

+2

あなたの字下げは、server_loopでは間違っています。 defの下のすべてがインデントされる必要があります。また、どこにもターゲットを定義しません。あなたの 'global target'ステートメントは単にグローバルを使うと言っていますが、コード内には1つも表示されていないことがわかります –

+0

あなたは正しいですが、インデントは問題ではないと思います。 –

+0

@ Jean-FrançoisFabreの回答では、本書のコードが想定していたとおりに機能しなかったことを意味します。多分本に誤りがあったでしょうか? –

答えて

1

私は願っています私は問題を正しく理解しています。

私は簡単にあなたのケースを再現することができます

something() 

def something(): 
    pass 

私はそれが動作することを定義した後somethingを呼び出す場合、私は

Traceback (most recent call last): 
    File "<string>", line 420, in run_nodebug 
    File "<module1>", line 1, in <module> 
NameError: name 'something' is not defined 

を取得します。

あなたはそれらを使用する前に関数を定義するを持っている

多くの言語として、関数呼び出しの前にPythonが関数定義を必要としていることを知っていることを期待して、あなたの本は逆順(top => down、global/mainからimplementation/functionへ) 。 個人的には、思考せずに入力(またはコピー/貼り付け)できる単ブロックの例が好きで、すぐに機能します。