Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 默认参数和可选参数之间的差异_Python_Wxpython_Optional Parameters_Keyword Argument - Fatal编程技术网

Python 默认参数和可选参数之间的差异

Python 默认参数和可选参数之间的差异,python,wxpython,optional-parameters,keyword-argument,Python,Wxpython,Optional Parameters,Keyword Argument,好的,代码: #!/usr/bin/python import wx import sys class XPinst(wx.App): def __init__(self, redirect=False, filename=None): wx.App.__init__(self, redirect, filename) def OnInit(self): frame = wx.Frame(None, -1, title='Redirect Te

好的,代码:

#!/usr/bin/python

import wx
import sys

class XPinst(wx.App):
    def __init__(self, redirect=False, filename=None):
        wx.App.__init__(self, redirect, filename)
    def OnInit(self):
        frame = wx.Frame(None, -1, title='Redirect Test', size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE)
        panel = wx.Panel(frame, -1)
        log = wx.TextCtrl(panel, -1, size=(500,400), style = wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL)
        redir=RedirectText(log)
        sys.stdout=redir
        print 'test'
        frame.Show()
        return True

class RedirectText:
    def __init__(self,aWxTextCtrl):
        self.out=aWxTextCtrl
    def write(self,string):
        self.out.WriteText(string)

app = XPinst()
app.MainLoop()
增加:

class MyFrame(wx.Frame)
    def __init__(self, parent, id, title, size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE):
        wx.Frame.__init__(self, parent, id, title, size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE)
取代:

frame = wx.Frame(None, -1, title='Redirect Test', size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE)
与:

现在,它没有运行

我希望能够在传递不同参数的代码中多次调用MyFrame构造函数

我尝试了很多东西

用所有参数实例化MyFrame 实例化myFrame并使用all,但默认参数
具有所有参数的构造函数方法签名
构造函数方法签名包含所有参数,但不包含默认参数
使用所有参数调用父构造函数方法
使用所有参数(默认参数除外)调用父构造函数方法

另外,本教程还提到了一种默认参数和可选参数数量不同的方法!(有什么区别?)

乌德帕特:

“它有七个参数。第一个参数没有默认值。其他六个参数有。这四个参数是可选的。前三个是必需的。”-

更新2:

使用分号更正,我刚刚尝试:

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title, size, style):
        wx.Frame.__init__(self, parent, id, title, size, style)
  • 我告诉你什么是论点(第二行)
  • 我用输入的参数调用(第三行)
更新3:

完整的错误消息是:

Traceback (most recent call last):
  File "test.py", line 29, in <module>
    app = XPinst()
  File "test.py", line 8, in __init__
    wx.App.__init__(self, redirect, filename)
  File "/usr/lib/python2.6/dist-packages/wx-2.8-gtk2-unicode/wx/_core.py", line 7978, in __init__
    self._BootstrapApp()
  File "/usr/lib/python2.6/dist-packages/wx-2.8-gtk2-unicode/wx/_core.py", line 7552, in _BootstrapApp
    return _core_.PyApp__BootstrapApp(*args, **kwargs)
  File "test.py", line 10, in OnInit
    frame = MyFrame(None, -1, title='Redirect Test', size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE)
  File "test.py", line 21, in __init__
    wx.Frame.__init__(self, parent, id, title, size, style)
  File "/usr/lib/python2.6/dist-packages/wx-2.8-gtk2-unicode/wx/_windows.py", line 497, in __init__
    _windows_.Frame_swiginit(self,_windows_.new_Frame(*args, **kwargs))
TypeError: Expected a 2-tuple of integers or a wxSize object.
回溯(最近一次呼叫最后一次):
文件“test.py”,第29行,在
app=XPinst()
文件“test.py”,第8行,在_init中__
wx.App.\uuuuu初始化(self,重定向,文件名)
文件“/usr/lib/python2.6/dist packages/wx-2.8-gtk2-unicode/wx/_core.py”,第7978行,在u init中__
self._BootstrapApp()
文件“/usr/lib/python2.6/dist packages/wx-2.8-gtk2-unicode/wx/_core.py”,第7552行,在_BootstrapApp中
返回_core_uu.PyApp_uuubootstrapapp(*args,**kwargs)
文件“test.py”,第10行,在OnInit中
frame=MyFrame(无,-1,title='Redirect Test',size=(620450),style=wx.STAY_ON_TOP | wx.DEFAULT_frame_style)
文件“test.py”,第21行,在_init中__
wx.Frame.\uuuuu init\uuuuuuuuuuuuuuux(自我、父项、id、标题、大小、样式)
文件“/usr/lib/python2.6/dist-packages/wx-2.8-gtk2-unicode/wx/_-windows.py”,第497行,在u init中__
_视窗框架开关(自,视窗新框架(*args,**kwargs))
TypeError:应为2元组整数或wxSize对象。

为什么它不起作用呢?

对我来说只要一个调整就可以了;子类
wx.Frame
语句后缺少冒号

一条评论;如果您只是将参数“传递”给父初始化器,请使用
*args
和/或
**kwargs
保存一些输入

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)
如果要修改或添加特定参数,可以只修改字典
kwargs
,例如

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        kwargs['size']=(1000,200)
        wx.Frame.__init__(self, *args, **kwargs)

关于运行用于开发的文件: 使用
python
,而不是
pythonw
,在控制台中运行您正在处理的脚本。后者会在发现错误时退出,并将其发送到拉拉岛

N:\Code>pythonw wxso.pyw

N:\Code>rem nothing happened.

N:\Code>python wxso.pyw
  File "wxso.pyw", line 24
    class MyFrame(wx.Frame)
                          ^
SyntaxError: invalid syntax

N:\Code>

关于关键字参数: 当您将参数作为关键字(例如标题、大小、样式)传递时,它们在实际使用它们的函数中的位置可能会完全不同。这里的第一行为
wx.Frame.\uuuu init\uuuu
函数中的第五个参数赋值“size”,这可能不是size。这可能是第100个参数,但您可以使用关键字来告诉它去哪里


“可选”有点模糊;关键字参数提供默认值,但默认值可能不合适。

您缺少
框架中的
位置。\uuuuu init\uuuu
调用。以下是来自以下方面的原型:

因此,基本上错误是,它期望
size
为2元组或wxSize对象,而您传递的内容与此不匹配。我猜,当您从构造函数中删除
size=
时,就会出现这种情况:

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title, size, style):
        wx.Frame.__init__(self, parent, id, title, size, style)
编辑:以下任一项都可以

        wx.Frame.__init__(self, parent, id, title, size=size, style=style)
        wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, size, style)
但是通过省略参数中的关键字,您的调用是按照传递的顺序处理的,如下所示

        wx.Frame.__init__(self, parent, id, title, pos=size, size=style)

当你说“它不跑”时,它会做什么?错误?向我们显示详细信息。屏幕上没有显示窗口,而是没有显示任何内容。您是否正在命名文件
*.pyw
?当我这样做的时候,我还“什么也得不到”类语法错误(见我的答案)。将它们命名为
*.py
和/或从控制台运行它们进行开发,那么它实际上会向您显示错误。Nick,我得到了一个“TypeError:应该是一个2元组的整数或wxSize对象”。我没有谈到这一点吗P他没有删除大小,更重要的是他删除了关键字参数,并用位置参数替换了它们,这有效地做到了
wx.Frame.\uu init\uuuu(self,parent,id=id,title=title,pos=size,size=style)
啊,对了-应该读了你的整个答案-我觉得问题还没有解决。是,然后不是,然后是,然后不是……这更像是一场讨论,而不是问答:P
class MyFrame(wx.Frame):
    def __init__(self, parent, id, title, size, style):
        wx.Frame.__init__(self, parent, id, title, size, style)
        wx.Frame.__init__(self, parent, id, title, size=size, style=style)
        wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, size, style)
        wx.Frame.__init__(self, parent, id, title, pos=size, size=style)