Как перенести программу на Python на Ruby

1

Я пытаюсь перенести программу Python в Ruby, но я совершенно не осведомлен о Python.

Не могли бы вы дать мне какие-нибудь советы?

Я хочу запустить метод sampletrain. Однако я не понимаю, почему features=self.getfeatures(item). getfeatures - это просто переменная экземпляра, не так ли? Кажется, он используется как метод.

docclass.py:

class classifier:
  def __init__(self,getfeatures,filename=None):
    # Counts of feature/category combinations
    self.fc={}
    # Counts of documents in each category
    self.cc={}
    self.getfeatures=getfeatures

  def train(self,item,cat):
    features=self.getfeatures(item)
    # Increment the count for every feature with this category
    for f in features:
      self.incf(f,cat)

    # Increment the count for this category
    self.incc(cat)
    self.con.commit()

  def sampletrain(cl):
    cl.train('Nobody owns the water.','good')
    cl.train('the quick rabbit jumps fences','good')
    cl.train('buy pharmaceuticals now','bad')
    cl.train('make quick money at the online casino','bad')
    cl.train('the quick brown fox jumps','good')
  • 1
    Вот предположение: возможно, второй аргумент, переданный во время инициализации, является функцией; хотя он присваивается свойству во время инициализации, он может быть вызван позже с помощью паренов. (Это похоже на JavaScript, но не на Python.)
  • 0
    @ThiefMaster и steenslag :) просто для работы .. спасибо за ваши хорошие комментарии.
Показать ещё 1 комментарий
Теги:

3 ответа

5
Лучший ответ

В Python, поскольку скобки для вызова метода не являются необязательными, можно различать ссылку на метод и вызов метода. т.е.

def example():
    pass

x = example # x is now a reference to the example 
            # method. no invocation takes place
            # but later the method can be called as
            # x()

против

x = example() # calls example and assigns the return value to x

Поскольку скобки для вызова метода необязательны в Ruby, вам нужно использовать какой-то дополнительный код, например x = method(:example) и x.call чтобы достичь того же.

  • 0
    Спасибо! Я постараюсь написать код на основе вашего ответа прямо сейчас.
  • 1
    Вы должны иметь возможность использовать стиль, который я дал выше, или написать initialize чтобы принять блок, как предложено tokland, в зависимости от того, хотите ли вы предоставить именованный метод или анонимный блок для функциональности getfeatures . Если вам нужны подробности, просто дайте мне знать.
3

Идиоматический способ отправки поведения в Ruby (поскольку getfeatures в вашем коде явно вызываемый) заключается в использовании блоков:

class Classifier
  def initialize(filename = nil, &getfeatures)
    @getfeatures = getfeatures
    ...
  end

  def train(item, cat)
    features = @getfeatures.call(item)
    ...
  end

  ...
end

Classifier.new("my_filename") do |item|
  # use item to build the features (an enumerable, array probably) and return them
end
2

Если вы переводите с Python, вам нужно будет изучить Python, чтобы вы не были "совершенно неосведомлены" об этом. Нет коротких сокращений.

  • 1
    да ты прав. Я начну учиться.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню