论坛首页 编程语言技术论坛

Why not Python?

浏览 14562 次
锁定老帖子 主题:Why not Python?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-11-15  
Suninny 写道
要是Python也具备Closure(Block)的话我绝不会多瞧下Ruby。

那么你可以不瞧ruby了 :) Python的函数是first class的,可以象block一样传递,功能一样,感觉比block更自然。
0 请登录后投票
   发表时间:2006-11-15  
qiezi 写道
我倒觉得相比起ruby来,python只能算是中规中矩,没多少出彩的地方。

ruby我认为最强的地方是可以open一个类,扩充它。另一个强的地方是关键字,ruby的关键字很少,而且很多关键字可以当成方法名来用,限制很少,只要你愿意,可以随意地扩充ruby,把它看成是语言的一部分。


应该说python更加叛逆一点。而ruby顺着另外一条莫测的道路多走了几步。
python最叛逆的是空白缩进强制性。ruby则是在把新的特性引入,但是是好是坏,确实很莫测。
0 请登录后投票
   发表时间:2006-11-15  
qiezi 写道
我倒觉得相比起ruby来,python只能算是中规中矩,没多少出彩的地方。

ruby我认为最强的地方是可以open一个类,扩充它。另一个强的地方是关键字,ruby的关键字很少,而且很多关键字可以当成方法名来用,限制很少,只要你愿意,可以随意地扩充ruby,把它看成是语言的一部分。

Python也具有Open Class 的特色的呀,你也可以实现这样的功能的。
class openclass():
	def test():
		print "test"
open = openclass()
open.test()
def test1():
	print "test1"
open.test=test1
open.test()


还有那个method missing,python也有的。
目前个人感觉ruby比较明显的就是语法大多数比较简洁,从字符数上来说。

BTW:听说你对D语言挺了解,什么时候发点关于D语言的Function的帖子吧
0 请登录后投票
   发表时间:2006-11-15  
geradle 写道
qiezi 写道
我倒觉得相比起ruby来,python只能算是中规中矩,没多少出彩的地方。

ruby我认为最强的地方是可以open一个类,扩充它。另一个强的地方是关键字,ruby的关键字很少,而且很多关键字可以当成方法名来用,限制很少,只要你愿意,可以随意地扩充ruby,把它看成是语言的一部分。

Python也具有Open Class 的特色的呀,你也可以实现这样的功能的。
class openclass():
	def test():
		print "test"
open = openclass()
open.test()
def test1():
	print "test1"
open.test=test1
open.test()


还有那个method missing,python也有的。
目前个人感觉ruby比较明显的就是语法大多数比较简洁,从字符数上来说。

BTW:听说你对D语言挺了解,什么时候发点关于D语言的Function的帖子吧


这个 python open class 的代码是运行期的行为。
能否更 declaraction 一点?

ruby 的 open class 严格来说,也是运行期的行为。因为就没有编译期。
不过,那个 include module 还有点 declaration 的影子。

method missing 不错。p
说明,理论上, python 的 web framework 也应该能够达到rail 的这个程度。
0 请登录后投票
   发表时间:2006-11-15  
geradle 写道

Python也具有Open Class 的特色的呀,你也可以实现这样的功能的。
class openclass():
	def test():
		print "test"
open = openclass()
open.test()
def test1():
	print "test1"
open.test=test1
open.test()


还有那个method missing,python也有的。
目前个人感觉ruby比较明显的就是语法大多数比较简洁,从字符数上来说。

BTW:听说你对D语言挺了解,什么时候发点关于D语言的Function的帖子吧

python似乎没办法扩充那些核心类呀,比如str类,ruby就没什么限制。

D语言的Function方面没多少可挖掘的,它有C的函数指针,C#的委托,C++的函数对象(仿函数),仅仅在语法上优于C/C++,并没有多少新东西,我还没深入研究,但目前看来应该还没多少亮点。
0 请登录后投票
   发表时间:2006-11-15  
buaawhl 写道

这个 python open class 的代码是运行期的行为。
能否更 declaraction 一点?
ruby 的 open class 严格来说,也是运行期的行为。因为就没有编译期。
不过,那个 include module 还有点 declaration 的影子。


geradle的那个代码更多的是open object methods的功能,而且不像是python的代码,方法的第一个不是self啊
python在open class和open object methods的实现上有非常微妙的差别,主要就是这个self引起的。针对class的修改是含self的(需要声明,但调用时不需要给出,解释器自动添加这个参数),并且影响到这个类所有的对象(包括以前生成的);对object的属性的赋值是不带self的(解释器不会自动添加self参数),并且只影响到被修改的对象。
我估计和ruby的区别主要是python中function是first class造成的,而方法是函数的一个特例,从而产生绑定和非绑定的区别。但仔细思考之后,发现这个处理方式是自洽的
如:
>>> class A(object):
...     def xxx(self):
...         print 'xxx'
...
>>> a = A()
>>> a
<__main__.A object at 0x00B33C90>
>>> a.xxx()
xxx

这里A是一个普通类,有一个xxx方法。 a是A的对象
>>> a.xxx = lambda :15
>>> a.xxx
<function <lambda> at 0x00B30AB0>
>>> a.xxx()
15

将a的xxx方法替换成 lambda : 15. 成功。说明这个时候解释器不会自动添加self
>>> a.xxx=lambda self:15
>>> a.xxx() 
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: <lambda>() takes exactly 1 argument (0 given)

将a的xxx方法替换成 lambda self:15,执行失败,进一步说明这个时候解释器不会自动添加self
>>> a.xxx(a)
15

手工添加第一个参数,成功.
>>> a1 = A()
>>> a1.xxx()
xxx
>>> A.xxx = lambda :16
>>> a1.xxx()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: <lambda>() takes no arguments (1 given)  

上面代码在类层次上修改方法,执行结果说明解释器自动传入了self作为第一参数,该方法处理上是bound的
>>> a.xxx()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: <lambda>() takes exactly 1 argument (0 given)

说明a.xxx一旦在对象作用域内并重新赋值,则必然覆盖类作用域中的定义和重新定义
但是类定义更改后的新对象,以及那些没有在对象作用域内的同名方法赋值的老对象,将调用修改后的类定义中的新方法,如下
>>> A.xxx = lambda self : 16
>>> a1.xxx()
16     
>>> a.xxx()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: unbound method <lambda>() must be called with A instance as first ar
ument (got nothing instead)
>>> a.xxx(a)
12
0 请登录后投票
   发表时间:2006-11-16  
首先纠正的一点是我上面的代码错误。
class openclass():   
    def test():   
        print "test" 

修改后的代码应该是:
class openclass():   
    def test(self):   
        print "test" 

缺少了Self在调用中是会出错的,昨天拷贝失误不好意思。
如果缺少self的话,调用会出现如下的错误:
>>> open.test()
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    open.test()
TypeError: test() takes no arguments (1 given)
>>> open.test=lambda:5
>>> open.test
<function <lambda> at 0x00B46EB0>
>>> open.test()
5

但是当我们对openclass的instance的test方法进行改变,却能正确运行。为什么会这样呢,我想应该和python对对象方法的搜寻路径有关,当我们改变了open.test之后,可以看出其地址为
<function <lambda> at 0x00B46EB0>

关于Charon在前面提到,可以直接改变类的方法,导致的Bound&Unbound的问题,我觉得应该也可以从对象方法搜索上来解释。这方面暂时没有任何了解,希望知道人share一下。过阵子自己也看看。
BTW:在写这个帖子的时候发现预览功能的一个defect,只在预览的时候有,提交了就没有。
  • 描述: 预览的截图
  • 大小: 70 KB
0 请登录后投票
   发表时间:2006-11-17  
引用
python感觉就是缺少了一个非常明确的应用方向.好像很多都可以做,让人难选择.


因为python可以做很多事情,而且还碰巧都干得不错,所以没有明确的应用方向?大家想要得是只能干一样事的语言?

Charon的解释不错,其实py和rb之间几乎没有什么是一个做得了一个完全没办法的,当然代价有不同。总的来说rb在open class/mixin上的确更加简洁优雅,而py则明显差了一点。

楼主引用的这篇文章讲得很清楚啦,py的最大优势在于它可以用来做几乎任何事情,毕竟,很多应用不是ROR这样一个web framework可以涵盖的。从语法上讲,rb9分的话py可以有8分,从应用的范围讲,py9分的话,rb大概只有5分左右(完全毫无根据的个人印象分)。

忍不住广告一番:

NumPy:科学运算库,已经是最新的官方发布的一部分了,NASA用它来计算运行轨道,所以应该还是值得信赖的。

google crawler 是python + C++写的。

bittorrent的官方实现。

twisted,超全的网络库。

Jython/Iron Python,可以使用绝大多数的python标准库以及java/.net库。

Django,数个python web framework中的一个,代表站点芝加哥犯罪网(http://www.chicagocrime.org/), 这是一个整合了芝加哥公共犯罪数据库,google map, 以及相关犯罪的新闻报道的站点。

SqlAlchemy:数据库工具包,从最底层的简单包装到ORM,已经与Django集成,大大提升了Django对遗留数据库系统的支持。

wxPython,不夸张地讲,这个项目重新激活了wxWindows项目。

...

太多太多,我现在做的一个项目,delphi画界面,python实现功能,就一个字,爽,呵呵。

很喜欢rb的语法,但是如果不能迅速扩大应用范围的话,可能最后连web这一块都悬,这个世界毕竟不是只有web项目的,web项目也毕竟不是只做教程上做的事情的。
0 请登录后投票
   发表时间:2006-11-17  
javavsnet 写道
那么你可以不瞧ruby了 :) Python的函数是first class的,可以象block一样传递,功能一样,感觉比block更自然。


你是说Python中受限的lambda问题可以由def func:之类的来解决吧。--功能性是能达到,却不符合简洁和审美的需要。给你看两段Ruby代码:

create_table "forums", :force => true do |t|
  t.column "name",         :string
  t.column "description",  :string
  t.column "topics_count", :integer, :default => 0
  t.column "posts_count",  :integer, :default => 0
  t.column "position",     :integer
end

task "prepare-release" => ["clobber"] do
  puts "Preparing release of #{PROJECT} version #{VERSION}"
  Rake::Task["test"].invoke
  Rake::Task["rdoc"].invoke
  Rake::Task["package"].invoke
end

0 请登录后投票
   发表时间:2006-11-17  
Suninny 写道

你是说Python中受限的lambda问题可以由def func:之类的来解决吧。--功能性是能达到,却不符合简洁和审美的需要。给你看两段Ruby代码:

create_table "forums", :force => true do |t|
  t.column "name",         :string
  t.column "description",  :string
  t.column "topics_count", :integer, :default => 0
  t.column "posts_count",  :integer, :default => 0
  t.column "position",     :integer
end


这个和
users_table = Table('users', meta, 
    Column('user_id', Integer, primary_key=True),
    Column('user_name', String(16)),
    Column('password', String(20))
)

没啥本质区别吧. 最大的差别是ruby在方法调用时可以省略括号造成的. 但从审美上来说看起来更加自然一些: 用最朴实的方式以同样的简洁实现了同样的功能,何必要求诸于block?
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics