В возвышенном, почему def run работает в одном случае, а не в другом, и как я могу заставить его работать?

У меня есть класс blahtestCommand(sublime_plugin.ApplicationCommand) с пробегом, он не работает.

Еще класс, у меня с sublime_plugin.TextCommmand) работает.

Я немного озадачен тем, как должно выглядеть определение запуска. Я знаю java (занимался ООП-программированием 10 лет назад, что я хорошо помню), но я очень мало знаю python. (поэтому я не совсем понимаю, что класс принимает параметр, поскольку его не было в java, но я бы сделал слабое предположение, что это немного похоже на «расширение» - наследование или «реализует»).

Я также пытаюсь определить, что в документации API ST2 могло бы сказать кому-то, что когда у класса есть параметр sublime_plugin.TextCommand, строка запуска def должна выглядеть так def run(self, edit), тогда как, когда класс имеет параметр sublime_plugin.ApplicationCommand, запуск def должен выглядеть - я не знаю, как. (так что это еще большая загадка)

Обратите внимание, что здесь view.run_('......') не работает для класса blahtest, он не печатает "ааааааааааааааааааааааааааааааааа

У меня в консоли ошибок вообще нет. Плагин - what.py загружается нормально. Следовательно, один метод запуска класса работает, а другой - нет. blahtestCommand загружается. Я могу поместить строку между def run и class blahtestCommand для печати «123456789», и она будет напечатана, как только я сохраню what.py, потому что она перезагружается и никаких ошибок. Просто его метод запуска не вызывается, когда я делаю view.run_command('blahtest')

import sublime, sublime_plugin

class blahtestCommand(sublime_plugin.ApplicationCommand):
    def run(self):
        print "aaaaaaaaaaa"

class butthiswillworkCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        print "bbbb"
>>> view.run_command('blahtest')
>>> view.run_command('butthiswillwork')
bbbb

добавлено по счастливой случайности. Мне удалось заставить его работать для WindowCommand

window.run_command('saef4',{"string":"abcd"})

, {"keys": ["ctrl+s", "ctrl+d"], "command": "saef4", "args": {"string": "abcd"} }

class saef4Command(sublime_plugin.WindowCommand): 
    def run(self,string):
        print "uabcccc"   

Я мог бы обновить этот вопрос в будущем относительно запуска «run» в классах возвышенного API.


person barlop    schedule 23.10.2013    source источник
comment
в качестве проверки ошибок попробуйте вернуть текст и вызвать print function в интерпретаторе.   -  person samrap    schedule 23.10.2013
comment
@samrap Я действительно знаком с python, почти не использовал его за пределами этого возвышенного плагина. и не совсем понимаю, что вы просите меня попробовать. например, какой код добавить, какую команду попробовать. Вы просите меня добавить оператор return в метод run для возврата текста? (из того, что я помню из java, основной метод был пустым.. может быть, python похож) и что вы имеете в виду под вызовом «функции печати» в интерпретаторе. Вы имеете в виду печать abcdefg, конечно, это работает.   -  person barlop    schedule 23.10.2013
comment
Как насчет того, чтобы сразу вызвать метод run экземпляра blahtestCommand?   -  person aIKid    schedule 23.10.2013
comment
попробуйте закрыть и снова открыть возвышенное и посмотреть, работает ли blahtestCommand...   -  person MattDMo    schedule 23.10.2013
comment
@MattDMo что? как вы думаете, какой код я изменил? обратите внимание, что в ответе на другой вопрос (если это то, о чем вы говорите?) именно ApplicationCommand был подклассом в ответе парня, я никогда не производил подкласс WindowCommand, и он тоже.   -  person barlop    schedule 23.10.2013
comment
@aIKid class classabcd: blah=blahtestCommand() blah.run() ‹-- работает, так что да, вызов метода run экземпляра blahtestCommand (хотя это почти выходит за рамки моих текущих способностей к Python!) работает. Итак, view.run_command('..') - это то, что не работает на blahtest. что является проблемой.   -  person barlop    schedule 23.10.2013
comment
@MattDMo, хотя теперь я добавил относительно WindowCommand.   -  person barlop    schedule 23.10.2013
comment
На самом деле никто не сказал, в чем именно заключается ваша проблема, но она заключается в следующем: представление .run_command('blahtest') должно быть возвышенным .run_command('blahtest'). ApplicationCommands определены для sublime, а TextCommands определены для views.   -  person ArtOfWarfare    schedule 23.09.2014


Ответы (1)


Насчет №1 вы правы. В Python это означает наследование. Синтаксис определения производного класса выглядит так: class DerivedClass(BaseClassName):.

Наследование в Python

Для № 2 Sublime Text 2 поддерживает три типа команд. Метод run вызывается при выполнении команды. Помимо обязательного параметра, вы можете определить столько параметров, сколько хотите для run. Когда вы запускаете команду с дополнительными параметрами, вам нужно передать эти параметры в карту.

  • ApplicationCommand: команда для всего Sublime Text 2. Нет обязательных параметров .
  • WindowCommand: команда для окна. Нет обязательных параметров.
  • TextCommand: команда для представления. Один обязательный параметр, edit.

Для № 3, как запустить:

  • ApplicationCommand: sublime.run_command('application_command_name'). Проверьте функцию run_command для возвышенного модуля в справочнике по API.
  • WindowCommand: window.run_command('window_command_name'). Проверьте run_command метод sublime.Window.
  • TextCommand: view.run_command('text_command_name'). Проверьте run_command метод sublime.View.

Пример 1: команды без дополнительных параметров

import sublime, sublime_plugin

class TestApplicationCommand(sublime_plugin.ApplicationCommand):
    def run(self):
        print("running TestApplicationCommand")


import sublime, sublime_plugin

class TestWindowCommand(sublime_plugin.WindowCommand):
    def run(self):
        print("running TestWindowCommand")


import sublime, sublime_plugin

class TestTextCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        print("running TestTextCommand")

Запустите эти команды:

>>> sublime.run_command('test_application')
running TestApplicationCommand
>>> window.run_command('test_window')
running TestWindowCommand
>>> view.run_command('test_text')
running TestTextCommand

Пример 2: команды с дополнительными параметрами

import sublime, sublime_plugin

class TestApplicationCommand(sublime_plugin.ApplicationCommand):
    def run(self, arg1, arg2):
        print("running TestApplicationCommand")
        print("arg1: " + arg1)
        print("arg2: " + arg2)


import sublime, sublime_plugin

class TestWindowCommand(sublime_plugin.WindowCommand):
    def run(self, arg1, arg2):
        print("running TestWindowCommand")
        print("arg1: " + arg1)
        print("arg2: " + arg2)


import sublime, sublime_plugin

class TestTextCommand(sublime_plugin.TextCommand):
    def run(self, edit, arg1, arg2):
        print("running TestTextCommand")
        print("arg1: " + arg1)
        print("arg2: " + arg2)

Запустите эти команды:

>>> sublime.run_command('test_application', {'arg1' : '1', 'arg2' : '2'})
running TestApplicationCommand
arg1: 1
arg2: 2
>>> window.run_command('test_window', {'arg1' : '1', 'arg2' : '2'})
running TestWindowCommand
arg1: 1
arg2: 2
>>> view.run_command('test_text', {'arg1' : '1', 'arg2' : '2'})
running TestTextCommand
arg1: 1
arg2: 2
person longhua    schedule 23.10.2013
comment
Зачем вам нужно импортировать его несколько раз? - person aIKid; 23.10.2013
comment
@aIKid Коды были скопированы из нескольких файлов. Я просто сохранил заявление об импорте. - person longhua; 23.10.2013
comment
выглядит блестяще, спасибо, я попробую, когда вернусь - person barlop; 23.10.2013
comment
извините, мне понадобилось время, чтобы попробовать это. Это совершенно великолепно! - person barlop; 30.10.2013
comment
Где в документации упоминается, что ApplicationCommand вызывается командой sublime.run_command?sublimetext.com/docs/ 2/api_reference.html для WindowCommand упоминает объект Window - хорошо. Для TextCommand упоминается объект View. Но где с ApplicationCommand он указывает, что его метод запуска может быть вызван с помощью sublime.run_command(..)? - person barlop; 30.10.2013
comment
@barlop Пожалуйста, проверьте run_command функциональный документ модуля sublime: запускает названную ApplicationCommand с (необязательными) заданными аргументами. - person longhua; 30.10.2013