nested function in python
2016-06-04 20:59
615 查看
Nested
Function in Python
up vote42down votefavorite 11 | What benefit or implications could we get with Python code like this:class some_class(parent_class): def doOp(self, x, y): def add(x, y): return x + y return add(x, y) I found this in an open-source project, doing something useful inside the nested function, but doing absolutely nothing outside it except calling it. (The actual code can be found here.) Why might someone code it like this? Is there some benefit or side effect for writing the code inside the nested function rather than in the outer, normal function? python nested-function
| ||||||||||||||||
a comment |
6 Answers
activeoldestvotesup vote64down voteaccepted | Normally you do it to make closures:def make_adder(x): def add(y): return x + y return add plus5 = make_adder(5) print(plus5(12)) # prints 17 Inner functions can access variables from the enclosing scope (in this case, the local variable x). If you're not accessing any variables from the enclosing scope, they're really just ordinary functions with a different scope.
| ||||||||
a comment |
up vote31down vote | Aside from function generators, where internal function creation is almost the definition of a function generator, the reason I create nested functions is to improve readability. If I have a tiny function that will only be invoked by the outer function, then I inline the definition so you don't have to skip around to determine what that function is doing. I can always move the inner method outside of the encapsulating method if I find a need to reuse the function at a later date. Toy example: import sys def Foo(): def e(s): sys.stderr.write('ERROR: ') sys.stderr.write(s) sys.stderr.write('\n') e('I regret to inform you') e('that a shameful thing has happened.') e('Thus, I must issue this desultory message') e('across numerous lines.') Foo()
| ||||
a comment |
up vote13down vote | One potential benefit of using inner methods is that it allows you to use outer method local variables without passing them as arguments.def helper(feature, resultBuffer): resultBuffer.print(feature) resultBuffer.printLine() resultBuffer.flush() def save(item, resultBuffer): helper(item.description, resultBuffer) helper(item.size, resultBuffer) helper(item.type, resultBuffer) can be written as follows, which arguably reads better def save(item, resultBuffer): def helper(feature): resultBuffer.print(feature) resultBuffer.printLine() resultBuffer.flush() helper(item.description) helper(item.size) helper(item.type)
| |||
add a comment |
up vote7down vote | I can't image any good reason for code like that. Maybe there was a reason for the inner function in older revisions, like other Ops. For example, this makes slightly more sense: class some_class(parent_class): def doOp(self, op, x, y): def add(x, y): return x + y def sub(x,y): return x - y return locals()[op](x,y) some_class().doOp('add', 1,2) but then the inner function should be ("private") class methods instead: class some_class(object): def _add(self, x, y): return x + y def doOp(self, x, y): return self._add(x,y)
| ||||||||||||||||
a comment |
up vote4down vote | The idea behind local methods is similar to local variables: don't pollute the larger name space. Obviously the benefits are limited since most languages don't also provide such functionality directly.
| ||
add a comment |
up vote1down vote | Are you sure the code was exactly like this? The normal reason for doing something like this is for creating a partial - a function with baked-in parameters. Calling the outer function returns a callable that needs no parameters, and so therefore can be stored and used somewhere it is impossible to pass parameters. However, the code you've posted won't do that - it calls the function immediately and returns the result, rather than the callable. It might be useful to post the actual code you saw.
| ||||||||||||||||||||||||
|
up vote2down votefavorite | I am writing a program that creates backup of directories. Which of the following approach is better for code organization? Create separate class for Backup and Zip logic - class BackupUtil: def backup(self): None class ZipUtil: def archive_dir(self): None Or use function nesting like this - class BackupUtil: def backup(self): def archive_dir(): None None python code-quality code-organization
| ||
add a comment |
3 Answers
activeoldestvotesup vote5down vote | In general, when the inner function is small and you want to make it clear that it's only useful to the enclosing function. Alternatively, when you need to return a function. The latter scenario is trivial since generally the inner function relies on variables in the enclosing functions's scope, so declaring it anywhere else isn't an option. You might be able to use a lambda in that case, but anything longer than one expression would need a full function declaration. Without the implementations it's hard to say which one you should choose in this case. I would hasten to add that you don't have to put everything in a class either.
| ||
add a comment |
up vote0down vote | Keeping the two separate would be useful for quite a few reasons: 1) You will have more flexibility working with either class (especially Class inheritance) 2) You can transform the two classes into modules that you can use in your other codes independently from each other 3) You will avoid unnecessarily creating a larger class when you maybe only need to use one of the two features 4) Keeping the functions separate also increases code readability when you later call these functions Hope that helps clarify somethings.
| ||
add a comment |
up vote0down vote | TL;DR: Use function nesting when you need the characteristics of function nesting Function Nesting Use Cases (mostly functional idioms, almost certainly incomplete since it's off the top of my head): closures function factory (programmatic function creation based on parameters) creating functions by calling functool.partial creating functions by using lambda any other reasons you need to create functions during call time Trade-offs: functions are strongly coupled the code is always called (unless it's in an if block) additional code complexity additional runtime cost (potentially, because the inner function get's re-defined with every call to the outer function) much harder to extend much harder to introspect on the inner function defintion |
相关文章推荐
- Python使用函数默认值实现函数静态变量的方法
- Ipython notebook安装
- Python Tricks(十六)—— list转换为str
- Python--基础学习--流程控制
- python 数据清理诺干错误
- Python内置函数chr() unichr() ord()
- Python机器学习开发环境搭建和GraphLab Create安装
- python爬虫的使用
- python str bytes转换
- Python进阶之函数式编程
- Python--详解Python中re.sub
- Opencv3.0-python的那些事儿:(四)、Opencv的图像阈值处理
- python学习第一天
- Python list 交集,并集,差集
- python学习 函数
- Python断行
- PYTHON 源码解析
- censys 数据库地理信息自定义接口(python版)
- python二叉树的层次遍历
- python之生成器