在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
- 已删除的对象?答案 0 :(得分: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))
答案 1 :(得分:1)
从terminal
开始,使用:
python3.1 your_program.py
答案 2 :(得分:1)
如果python 3.1不可用,就像@JoeIddon回答中的注释一样,您可能需要更改代码库。在这种情况下,您可以:
具有避免多次修改代码的优势。
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))
答案 3 :(得分:1)
在终端中,给出安装python 3.1的路径,如下所示:
/<python3.1 folder>/bin/python filename.py
或者,您可以尝试创建虚拟环境并将其激活 然后你可以运行给定的脚本 这是辅助链接:http://docs.python-guide.org/en/latest/dev/virtualenvs/
答案 4 :(得分: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:
答案 5 :(得分: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__
您还可以查看this question的答案,其中OP希望为同一目的重新实现Callable
。
如果您仍想尝试安装旧版本的Python 3,可以试试以下内容。我假设Raspbian是基于Debian的发行版并且适用相同的命令。这是验证您可以在Debian Jessie-compatiblebe系统上执行此操作的Dockerfile
。您可以在shell中尝试RUN
命令:
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
答案 6 :(得分:0)
最后,我得到了所有问题的答案。我在答案中使用了很多东西来解决我的所有问题。他们来了:
1)是否有可替换的可调用对象?
基本上没有。至少没有一个在这种情况下工作。我将解释为什么这不会影响我的解决方案。
我犯了错误,只是从我的TKinter应用程序中删除了代码,而没有看到我的include
- 依赖项。 saaj的anwer让我重新思考,如果曾经使用过沼泽,事实上我做了。我甚至在书架上找到了等同的德语(&#34; Programmieren lernen mit python&#34;)。傻我! X}
我的GUI组件在不同的文件中定义,我只是在我的主应用程序main.py
中导入它们。
我在编程方面不是很先进,所以我不知道例如:
sub.py :(早在main.py之前写的)
import THISISTHEFORGOTTENMODULE
def subfoo(temp=0):
... #some Code in which Functions from THISISTHEFORGOTTENMODULE were used
main.py:
import sub
subfoo()
temp = SuperSpecialFunctionFromForgottenModule()
subfoo(temp)
这个星座导致的行为是,当我写main.py时,我没有说THISISTHEFORGOTTENMODULE.SomeSpeci...
。如果我写完这篇文章,我会马上知道在新程序中我要导入的内容。当我最近看到这段代码时,我认为Callable
来自标准库。不幸的是,在python之前存在一个只有一个字符(主要C而不是小c)的函数,并且被删除了。这误导了我寻找其他选择。像functools.partial
这样的东西(信用到电子邮件)会在某些情况下起作用,感谢你的知识,但它并没有多次工作。
当我最终在其中一个子模块中找到from swampy import *
时,我对自己踩到this tripwire感到很生气。(具有讽刺意味的是,我是解决这个问题的人)。
此部分的信用:saaj,e.s.和我自己(研究人员)
2)+3)如何同时安装多个python版本?
好吧,我查看了所有建议,对我来说,update-alternatives
效果最好。我设法使用以下建议安装python3.1:
我在这里提到这一点是因为它是问题的一部分,但我不再需要这个了,我只是在这里留下答案给任何经过并需要它的人。
在我的结果摘要中写下所有这些内容结束时,我要感谢帮助我解决这个问题的所有人。