On Sun, Dec 05, 2021 at 05:31:58PM -0700, Finn Mason wrote:

> Also, on a kind of side note, what would be a situation where early binding
> is advantageous to late binding? I can't think of one off the top of my
> head.

If your language only has one, early binding is better. You can easily 
simulate late binding if your language only gives you early:

    def func(arg=None):
        # You know the drill...
        if arg is None:
            arg = expression


And you only pay the cost of call-time evaluation of the expression when 
you actually need it to be evaluated at call-time.

But to go the other way is inconvenient and annoying, requiring the use 
of a global variable (or some other storage) for every parameter:

    FUNC_DEFAULT_VALUE = expression

    def func(arg=>None):
        if arg is None:
            arg = FUNC_DEFAULT_VALUE

And now, your early-bound default still pays the cost of evaluating the 
sentinel expression (in this case None), but you also pay the cost of a 
global lookup to get the cached value of the expression.

You lose encapsulation (the cached value is no longer part of the 
function object) and efficiency.

Compiled languages with good optimizing compilers may be able to 
optimize away some of that cost. If your language supports static 
storage for functions, you can use that. But in general, without come 
sort of language support, simulating early binding in a language which 
only provides late binding is not as easy, convenient or efficient as 
doing it the other way.



-- 
Steve
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/ZZRHBB4F3W5FZNAARPXANWOFII5KAITU/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to