Python3 Antlr4 AttributeError: у объекта CommonToken нет атрибута getLine

Для непримитивных функций база R включает в себя функцию, называемую body(), которая возвращает тело функции. Например, источник функции print.Date() можно просмотреть:

body(print.Date)

выдает следующее:

{
    if (is.null(max)) 
        max <- getOption("max.print", 9999L)
    if (max < length(x)) {
        print(format(x[seq_len(max)]), max = max, ...)
        cat(" [ reached getOption(\"max.print\") -- omitted", 
            length(x) - max, "entries ]\n")
    }
    else print(format(x), max = max, ...)
    invisible(x)
}

Если вы работаете в скрипте и хотите, чтобы код функции как символ символа, вы можете получить его.

capture.output(print(body(print.Date)))

доставит вам:

[1] "{"                                                                   
[2] "    if (is.null(max)) "                                              
[3] "        max <- getOption(\"max.print\", 9999L)"                      
[4] "    if (max < length(x)) {"                                          
[5] "        print(format(x[seq_len(max)]), max = max, ...)"              
[6] "        cat(\" [ reached getOption(\\\"max.print\\\") -- omitted\", "
[7] "            length(x) - max, \"entries ]\\n\")"                      
[8] "    }"                                                               
[9] "    else print(format(x), max = max, ...)"                           
[10] "    invisible(x)"                                                    
[11] "}"     

Зачем мне это делать? Я создал пользовательский объект S3 (x, где class(x) = "foo") на основе списка. Один из участников списка (называемый «fun») был функцией, и я хотел print.foo() отобразить исходный код функции с отступом. Таким образом, я получил следующий фрагмент в print.foo():

sourceVector = capture.output(print(body(x[["fun"]])))
cat(paste0("      ", sourceVector, "\n"))

, который отступы и отображает код, связанный с x[["fun"]].

1
задан David Callanan 29 March 2019 в 10:06
поделиться

1 ответ

Если я посмотрю на источник среды выполнения Python 3, то увижу CommonToken так :

class CommonToken(Token):

    # An empty {@link Pair} which is used as the default value of
    # {@link #source} for tokens that do not have a source.
    EMPTY_SOURCE = (None, None)

    def __init__(self, source = EMPTY_SOURCE, type = None, channel=Token.DEFAULT_CHANNEL, start=-1, stop=-1):
        super(CommonToken, self).__init__()
        self.source = source
        self.type = type
        self.channel = channel
        self.start = start
        self.stop = stop
        self.tokenIndex = -1
        if source[0] is not None:
            self.line = source[0].line
            self.column = source[0].column
        else:
            self.column = -1

    ...

и Token так:

class Token (object):

    ...

    def __init__(self):
        self.source = None
        self.type = None # token type of the token
        self.channel = None # The parser ignores everything not on DEFAULT_CHANNEL
        self.start = None # optional; return -1 if not implemented.
        self.stop = None  # optional; return -1 if not implemented.
        self.tokenIndex = None # from 0..n-1 of the token object in the input stream
        self.line = None # line=1..n of the 1st character
        self.column = None # beginning of the line at which it occurs, 0..n-1
        self._text = None # text of the token.

    ...
]

Итак, я думаю, это должно сделать это для вас:

return (token.line, token.column)
0
ответ дан Bart Kiers 29 March 2019 в 10:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: