Объявление функции в Python, чтобы иметь читаемый и чистый код? - PullRequest
7 голосов
/ 16 октября 2010

Можно ли объявлять функции в python и определять их позже или в отдельном файле?

У меня есть код вроде:

class tata:
   def method1(self):
      def func1():
         #  This local function will be only used in method1, so there is no use to
         # define it outside.
         #  Some code for func1.
      # Some code for method1.

Проблема в том, что код становится грязным и трудным для чтения. Поэтому мне интересно, возможно ли, например, объявить func1 внутри method1 и определить его позже?

Ответы [ 5 ]

6 голосов
/ 16 октября 2010

Конечно, нет проблем:

foo.py:

def func1():
    pass

script.py:

import foo
class tata:
   def method1(self):
      func1=foo.func1
3 голосов
/ 16 октября 2010

Я думаю, что вы хотите импортировать функцию в method1, например,

def method1(...):
    from module_where_func1_is_defined import func1
    # do stuff
    something = func1(stuff, more_stuff)
    # do more stuff

Модули Python - это просто файлы; Пока файл module_where_func1_is_defined.py находится в том же каталоге, что и ваш скрипт, method1 сможет импортировать его.

Если вы хотите иметь возможность настроить способ работы method1, а также прояснить, что он использует func1, вы можете передать func1 в method1 в качестве параметра по умолчанию:

import other_module

# various codes

def method1(other_args, func=other_module.func1)
    # do stuff
    something = func(stuff, more_stuff)
    # do more stuff
2 голосов
/ 16 октября 2010

Если func1 () должен обрабатывать что-либо, содержащееся в области действия method1 (), лучше оставить определение func1 () там. Вам нужно, чтобы func1 () получала любые подходящие данные в качестве параметров, если они не определены в рамках метода method1 ()

2 голосов
/ 16 октября 2010

Внутреннее определение создает отдельное имя во внутренней области видимости.Это будет затенять все, что вы определите позже с тем же именем.Если вы хотите определить функцию позже, просто сделайте это.Имя будет проверяться только в том случае, если оно действительно используется.

def foo():
  print 'foo'
  bar()

def bar():
  print 'bar'

foo()
0 голосов
/ 16 октября 2010

Впоследствии вы можете создавать методы


class Something(object):
   def test1(self):
     pass

def dummy(self):
   print "ok", self

Something.test1 = dummy

Однако невозможно иметь анонимную функцию (ну, есть лямбда-выражения, но вы не можете иметь там операторов), поэтому вы должны предоставить временное имя

Возможно, вы захотите использовать декораторы, чтобы сделать его более читабельным:

def define(cls, name):
  def decor(f):
     setattr(cls, name, f)
  return decor


class Something(object):
   def test1(self):
     pass

@define(Something, "test1")
def dummy(self):
   print "ok", self

Этот код должен быть более читабельным. Он все равно будет загрязнять пустышку, но инициализирует его нулем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...