2013-04-28 2 views
1

Я делаю мод для версии Minecraft от малины Pi, и каждый раз, когда я вводил одну из команд в свою программу, я получаю очень неприятную ошибку. Вот мой код:Python NameError из содержимого переменной

import minecraft.minecraft as minecraft 
import minecraft.block as block 
import time 

mc = minecraft.Minecraft.create(); 

print('newBlock - Change ID of block to spawn') 
print('blockType - Change subID of block to spawn') 
print('pos1') 
print('pos2') 
print('fill - fill specified area') 
print('clear - clear specified area') 
print 
while True: 
comm=str(input('Command: ')) 
if comm=="newBlock": 
    blockId = int(input('Enter Block ID: ')) 
    mc.postToChat('Block set to ID: ' + str(blockId)) 
if comm=="blockType": 
    blockData = int(input('Enter Block Type: ')) 
if comm=="pos1": 
    position1 = mc.player.getPos() 
    mc.postToChat('Set Position 1 as: x' + str(position1.x) + ' y' + str(position1.y) + ' z' + str(position1.z)) 
if comm=="pos2": 
    position2 = mc.player.getPos() 
    mc.postToChat('Set Position 2 as: x' + str(position2.x) + ' y' + str(position2.y) + ' z' + str(position2.z)) 
if comm=="fill": 
    mc.setBlocks(position1.x, position1.y, position1.z, position2.x, position2.y, position2.z, blockId, blockType) 
    mc.postToChat('Filled specified area with: ' + str(blockId)) 
if comm=="clear": 
    mc.setBlocks(position1.x, position1.y, position1.z, position2.x, position2.y, position2.z, 0) 
    mc.postToChat('Cleared specified area') 

Everytime вход вводится пользователем через «комм» переменной программа выплевывает это сообщение об ошибке:

Traceback (most recent call last): 
    File "WorldEditPi.py", line 15, in <module> 
     comm=str(input('Command: ')) 
    File "<string>", line 1, in <module> 
NameError: name 'newBlock(or what ever the user entered into 'comm')' is not defined 

Что действительно смущает то, что он даже не говорит о переменная 'newBlock' не является переменной, она является содержимым переменной 'comm'. Это происходит со всеми командами, а не только с «newBlock».

ответ

3

Вы используете input, где вам нужно использовать raw_input. input оценивает строку, которую она передала. raw_input дает вам строку, которую вы хотите. не

Обратите внимание, что это применимо только в Python 2. В Python 3, raw_input больше не доступен и input является эквивалентом Python 2-х raw_input. В Python 2 input эквивалентен eval(raw_input)

0

При использовании ввода() для ввода newBlock синтаксический анализатор рассматривает newBlock как переменную вместо строки. так что вам нужно использовать raw_input

см реф на входе()

def input(prompt): 
    return (eval(raw_input(prompt)))