Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unhelpful SyntaxError #90561

Closed
1071754 mannequin opened this issue Jan 16, 2022 · 6 comments
Closed

Unhelpful SyntaxError #90561

1071754 mannequin opened this issue Jan 16, 2022 · 6 comments
Labels
3.9 only security fixes interpreter-core (Objects, Python, Grammar, and Parser dirs)

Comments

@1071754
Copy link
Mannequin

1071754 mannequin commented Jan 16, 2022

BPO 46403
Nosy @terryjreedy, @ericvsmith, @lysnikolaou, @pablogsal
Files
  • tic_tac_toe.py: tic tac toe in python
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields:

    assignee = None
    closed_at = <Date 2022-01-17.05:23:27.444>
    created_at = <Date 2022-01-16.20:12:33.263>
    labels = ['interpreter-core', 'invalid', '3.9']
    title = 'Unhelpful SyntaxError'
    updated_at = <Date 2022-01-17.05:26:33.598>
    user = 'https://bugs.python.org/1071754'

    bugs.python.org fields:

    activity = <Date 2022-01-17.05:26:33.598>
    actor = 'terry.reedy'
    assignee = 'none'
    closed = True
    closed_date = <Date 2022-01-17.05:23:27.444>
    closer = 'terry.reedy'
    components = ['Parser']
    creation = <Date 2022-01-16.20:12:33.263>
    creator = '1071754'
    dependencies = []
    files = ['50565']
    hgrepos = []
    issue_num = 46403
    keywords = []
    message_count = 6.0
    messages = ['410720', '410721', '410722', '410723', '410741', '410742']
    nosy_count = 4.0
    nosy_names = ['terry.reedy', 'eric.smith', 'lys.nikolaou', 'pablogsal']
    pr_nums = []
    priority = 'normal'
    resolution = 'not a bug'
    stage = 'resolved'
    status = 'closed'
    superseder = None
    type = None
    url = 'https://bugs.python.org/issue46403'
    versions = ['Python 3.9']

    @1071754
    Copy link
    Mannequin Author

    1071754 mannequin commented Jan 16, 2022

    Here is my code:
    import random
    def drawBoard(board):
    print(board[7] + '|' + board[8] + '|' + board[9])
    print('-+-+-')
    print(board[4] + '|' + board[5] + '|' + board[6])
    print('-+-+-')
    print(board[1] + '|' + board[2] + '|' + board[3])

    def inputPlayerLetter():
        letter=''
        while not (letter=="X" or letter=="O"):
            print('Do you want to be X or O?')
            letter=input.upper()
            if letter =='X':
                return['X','O']
            else:
                return['O','X']
    
    def whoGoesFirst():
        if random.randint(0,1) == 0:
            return 'computer'
        else:
            return 'player'
    
    def makeMove(board,letter,move):
        board[move]=letter
    
    def isWinner(bo,le):
         return ((bo[7] == le and bo[8] == le and bo[9] == le) or
                ((bo[4] == le and bo[5] == le and bo[6] == le) or
                ((bo[1] == le and bo[2] == le and bo[3] == le) or
                ((bo[7] == le and bo[4] == le and bo[1] == le) or
                ((bo[8] == le and bo[5] == le and bo[2] == le) or
                ((bo[9] == le and bo[6] == le and bo[3] == le) or
                ((bo[7] == le and bo[5] == le and bo[3] == le) or
                ((bo[9] == le and bo[5] == le and bo[1] == le))
    def getBoardCopy(board):
        boardCopy=[]
        for i in board:
            boardCopy.append(i)
        return boardCopy
    
    def isSpaceFree(board,move):
        return board[move] == ''
    
    def getPlayerMove(board):
        move=''
        while move not in '1 2 3 4 5 6 7 8 9'.split() or not
          isSpaceFree(board,int(move)):
            print('What is your next move? (1-9)')
            move=input()
        return int(move)
    
    def chooseRandomMoveFromList(board,movesList):
        possibleMoves=[]
        for i in movesList:
            if isSpaceFree(board,i):
                possibleMoves.append(i)
    
        if len(possibleMoves) != 0:
            return random.choice(possibleMoves)
        else:
            return None
    
    def getComputerMove(board,computerLetter):
        if computerLetter=='X':
            playerLetter=='O'
        else:
            playerLetter=='X'
    
        for i in range(1,10):
            boardCopy=getBoardCopy(board)
            if isSpaceFree(boardCopy,i):
                makeMove(boardCopy,computerLetter,i)
                if isWinner(boardCopy,playerLetter):
                    return i
    
        move=chooseRandomMoveFromList(board, [1,3,7,9])
        if move!=None:
            return move
    
        if isSpaceFree(board,5):
            return 5
    return chooseRandomMoveFromList(board, [2,4,6,8])
    
    def isBoardFull(board):
        for i in range(1,10):
            if isSpaceFree(board,i):
                return False 
            for i in range(1,10):
                if isSpaceFree(board,i):
                    return False
            return True
        print('Welcome to Tic-Tac-Toe')
    
    while True:
        theBoard=[''] * 10
        playerLetter, computerLetter=inputPlayerLetter()
        turn=whoGoesFirst()
        print('The ' + turn + ' will go first.')
        gameIsPlaying=True
    
        while gameIsPlaying:
            if turn=='player':
                drawBoard(theBoard)
                move=getPlayerMove(theBoard)
                makeMove(theBoard,playerLetter,move)
    
                if isWinner(theBoard,playerLetter):
                    drawBoard(theBoard)
                    print('Hooray! You have won the game!')
                    gameIsPlaying=False
                else:
                    if isBoardFull(theBoard):
                        drawBoard(theBoard)
                        print('The game is a tie!')
                        break
                    else:
                        turn='computer'
    else:
        move=getComputerMove(theBoard, computerLetter)
        makeMove(theBoard,computerLetter,move)
    
            if isWinner(theBoard,computerLetter):
                drawBoard(theBoard)
                print('The computer has beat you! You lose.')
                gameIsPlaying=False
            else:
                if isBoardFull(theBoard):
                    drawBoard(theBoard)
                    print('The game is a tie!')
                    break
                else:
                    turn='player'
        print('Do you want to play again! (yes or no)')
        if not input().lower().startswith('y'):
            break
    On def getBoardCopy(board):, it says "SyntaxError:invalid syntax". I looked through the code and found nothing wrong. Why is this?

    @1071754 1071754 mannequin added the topic-IDLE label Jan 16, 2022
    @1071754 1071754 mannequin assigned terryjreedy Jan 16, 2022
    @1071754 1071754 mannequin added 3.9 only security fixes topic-IDLE labels Jan 16, 2022
    @1071754 1071754 mannequin assigned terryjreedy Jan 16, 2022
    @1071754 1071754 mannequin added the 3.9 only security fixes label Jan 16, 2022
    @ericvsmith
    Copy link
    Member

    This is not the appropriate place to ask for help in debugging your code. I suggest you ask on the python-list mailing list.

    The error is that you're missing a bunch of right parenthesis in the isWinner() function.

    I do think "Syntax Error" isn't the best error message, though.

    Here's a simplified reproducer:
    ---------------

    def f():
         return ((1==2)
    x

    Note that in 3.11 (the only other version I have handy), the error is:

    File "foo.py", line 2
    return ((1==2)
    ^
    SyntaxError: '(' was never closed

    I suspect that we won't fix this in old versions of python.

    @ericvsmith ericvsmith added interpreter-core (Objects, Python, Grammar, and Parser dirs) and removed topic-IDLE labels Jan 16, 2022
    @ericvsmith ericvsmith changed the title SyntaxError for no reason Unhelpful SyntaxError Jan 16, 2022
    @ericvsmith ericvsmith added interpreter-core (Objects, Python, Grammar, and Parser dirs) and removed topic-IDLE labels Jan 16, 2022
    @ericvsmith ericvsmith changed the title SyntaxError for no reason Unhelpful SyntaxError Jan 16, 2022
    @ericvsmith
    Copy link
    Member

    [Numeric id's automatically get dropped from the nosy list: trying to add it back]

    @ericvsmith
    Copy link
    Member

    [And I was unable to add the numeric id as nosy. Apologies to the OP, who probably will never see this! It's a bug in the bpo software.]

    @terryjreedy
    Copy link
    Member

    For non-coredevs, 'not a bug' means not a bug in the CPython interpreter, as opposed to user code, which here has bugs.

    People asking questions (preferably in a more appropriate place) should read, for instance,
    https://stackoverflow.com/help/minimal-reproducible-example
    How to create a Minimal, Reproducible Example

    A minimal reproducer is '('. In 3.9, the message is 'unexpected EOF while parsing'. It is not unusual for beginners to leave out the message when reporting an exception in text rather than copy-pasting the last few lines of the traceback (which indicates exactly where the error is caught).

    [bpo software should be rejecting number IDs]

    I sent an email to Hayden.

    @terryjreedy terryjreedy removed their assignment Jan 17, 2022
    @terryjreedy terryjreedy removed their assignment Jan 17, 2022
    @terryjreedy
    Copy link
    Member

    Email bounced.

    @ezio-melotti ezio-melotti transferred this issue from another repository Apr 10, 2022
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    3.9 only security fixes interpreter-core (Objects, Python, Grammar, and Parser dirs)
    Projects
    None yet
    Development

    No branches or pull requests

    2 participants