5

在 python 3.1 出现的时候,我有一些旧程序。在程序中,我经常使用 将Callable()函数及其参数传递给我的 TKinter 应用程序:

tvf.mi(datei_bu, text=datei_opt, command=Callable(exec_datei_opts, datei_opt))

现在我想再次使用我的程序,但callable- 对象不见了。在网上,我发现这个功能在 python 3.2 中被删除了,没有一个替代品对我有用。

最后我决定重新安装python 3.1。但是,我不知道是否可以同时安装多个 python 3 版本,或者当我想使用这个特殊版本时如何为这个版本“创建”一个 shell 命令。

我的问题是:

  • 是否有替换Callable- 已删除的对象?
  • 如何同时使用多个 python 版本?
  • 如何创建匹配的 shell 命令?
4

7 回答 7

2

Callable 看起来很可疑functools.partial

这是部分工作。当我运行时:

from functools import partial
from operator import mul

def do_stuff(num, command):
    return num + command()

for y in range(5):
    print(do_stuff(5, partial(mul, y, 2)))

我得到:

5
7
9
11
13

你应该能够做到:

from functools import partial
tvf.mi(datei_bu, text=datei_opt, command=partial(exec_datei_opts, datei_opt))
于 2017-11-30T07:41:04.067 回答
1

terminal,运行:

python3.1 your_program.py
于 2017-11-14T21:09:12.070 回答
1

如果 python 3.1 不可用,就像@JoeIddon 答案的评论中的情况一样,您可能必须更改您的代码库。在这种情况下,您可以:

使用 functools.partial 修补可调用的猴子

具有避免多次代码修改的优点。

from functools import partial
Command = partial
tvf.mi(datei_bu, text=datei_opt, command=Command(exec_datei_opts, datei_opt))

或者:

用 lambda 替换 Callable() 是可行的,但会带来多次代码更改的负担。

tvf.mi(datei_bu, text=datei_opt, command=Callable(exec_datei_opts, datei_opt))

用。。。来代替:

tvf.mi(datei_bu, text=datei_opt, command=lambda x=datei_opt: exec_datei_opts(x))
于 2017-11-30T06:47:28.327 回答
1

在终端中,给出安装 python 3.1 的路径,如下所示:

/<python3.1 folder>/bin/python  filename.py

或者,您可以尝试创建虚拟环境并激活它,然后您可以运行给定的脚本,这里是帮助链接:http ://docs.python-guide.org/en/latest/dev/virtualenvs/

于 2017-11-30T07:11:08.630 回答
1

使用update-alternatives命令。它可以帮助您灵活地使用python。

这是示例代码。

$ sudo update-alternatives --list python3
update-alternatives: error: no alternatives for python

$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.4 1
update-alternatives: using /usr/bin/python3.4 to provide /usr/bin/python3 (python3) in auto mode
$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 2
update-alternatives: using /usr/bin/python3.5 to provide /usr/bin/python3 (python3) in auto mode

$ sudo update-alternatives --config python3
There are 2 choices for the alternative python3 (providing /usr/bin/python3).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /usr/bin/python3.5   2         auto mode
  1            /usr/bin/python3.4   1         manual mode
  2            /usr/bin/python3.5   2         manual mode

Press enter to keep the current choice[*], or type selection number:
于 2017-11-30T07:18:40.740 回答
1

Python 似乎从未Callable内置过。您可能将它与确实被删除然后又带回来的谓词混淆了:callable

3.2 版中的新功能:此功能首先在 Python 3.0 中被删除,然后在 Python 3.2 中重新出现。

我可以在网上找到的所有参考资料Callable都指向swampy包( Think Python书的副产品),它有swampy.Gui.Callable

class Callable(object):
    """Wrap a function and its arguments in a callable object.
    Callables can can be passed as a callback parameter and invoked later.
    This code is adapted from the Python Cookbook 9.1, page 302,
    with one change: if call is invoked with args and kwds, they
    are added to the args and kwds stored in the Callable.
    """
    def __init__(self, func, *args, **kwds):
        self.func = func
        self.args = args
        self.kwds = kwds

    def __call__(self, *args, **kwds):
        d = dict(self.kwds)
        d.update(kwds)
        return self.func(*self.args+args, **d)

    def __str__(self):
        return self.func.__name__

您还可以查看此问题Callable的答案,其中 OP出于相同目的想要重新实现。

安装 Python 3.1

如果你还想尝试安装旧版本的 Python 3,可以尝试以下方法。我假设 Raspbian 是基于 Debian 的发行版,并且适用相同的命令。这Dockerfile是验证您可以在 Debian Jessie-compatibe 系统上执行此操作的方法。RUN您可以在 shell中尝试来自它的命令:

FROM debian:jessie

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && \
    apt-get install --no-install-recommends --yes software-properties-common && \
    add-apt-repository ppa:deadsnakes/ppa && \
    # The PPA is designed for Ubuntu, but the trick makes it work
    # because Debian Jessie is compatible with Ubuntu Trusty #
    # on package-level
    sed -i 's/jessie/trusty/g' \
        /etc/apt/sources.list.d/deadsnakes-ppa-jessie.list && \
    apt-get update && \
    apt-get install --no-install-recommends --yes python3.1

CMD python3.1
于 2017-11-30T10:34:40.870 回答
0

最后,我得到了所有问题的答案。我在这里使用了很多答案来解决我的所有问题。他们来了:

1) 是否有替代已消失的可调用对象?

基本上没有。至少没有一个在这种情况下起作用。我将解释为什么这不会影响我的解决方案。

我犯了一个错误,只是从我的 TKinter 应用程序中删除代码,而不看我的 -dependencies include。saaj 的 anwer 让我重新思考是否曾经使用过 swampy,我确实做到了。我什至在我的书架上找到了对应的德语版本(“Programmieren lernen mit python”)。傻我!X}

我在不同的文件中定义了我的 GUI 组件,我只是将它们导入到main.py我的主应用程序中。

我在编程方面不是很先进,所以我不知道,例如:

sub.py:(在 main.py 之前很久就写好了)

import THISISTHEFORGOTTENMODULE

def subfoo(temp=0):
    ... #some Code in which Functions from THISISTHEFORGOTTENMODULE were used

主要.py:

import sub

subfoo()
temp = SuperSpecialFunctionFromForgottenModule()
subfoo(temp)

这个星座导致了我在编写 main.py 时不必说的行为THISISTHEFORGOTTENMODULE.SomeSpeci...。如果我写这个,我会立即知道我必须在我的新程序中导入什么。当我最近看到这段代码时,我以为Callable来自标准库。不幸的是,之前在 python 中存在一个仅在一个字符(主要 C 而不是次要 c)中不同的函数,并被删除。这误导我寻找替代品。像functools.partial(es 的学分)之类的东西,在某些情况下会起作用,感谢您的知识,但它没有多次起作用。

当我最终from swampy import *在其中一个子模块中找到一个时,我对自己踏入这条绊线感到生气。(具有讽刺意味的是,我正是解决这个问题的人)。

这部分归功于:saaj、es 和我自己(用于研究的东西)

2)+3) 如何同时安装多个python版本?

好吧,我查看了所有建议,对我来说,update-alternatives效果最好。我设法按照以下建议安装了 python3.1:

  • sanket mokashi(虚拟环境建议)
  • saaj (dockerfile 的东西按照它应该的方式解决了)
  • Byeongguk Gong(这是最舒服的方式!)

我只是在这里提到这一点,因为它是问题的一部分,但我不再需要它了,我将把答案留给路过并需要它的任何人。


在我的结果总结中写下所有这些内容的最后,我要感谢所有帮助我解决这个问题的人。

于 2017-12-01T18:13:30.707 回答