在考虑设计时,在哪些情况下使用class与dict是否有意义?优点和缺点也很有用.
例如,
class AlbumState:
""" AlbumState class, tracks photos shown, etc"""
def __init__ (self, album):
""" album for this object will track state"""
self.album = album
self.photos_shown = []
self.photos_notshown = range(album.size())
Run Code Online (Sandbox Code Playgroud)
与
albumstate['album'] = album
albumstate['photos_shown'] = []
albumstate['photos_notshown'] = range(album.size())
Run Code Online (Sandbox Code Playgroud) 我曾试图在这里问过一次问题,但没有人理解我想问的问题.所以我在PHP中找到了一些例子.
// $_POST = array('address' => '123', 'name' => 'John Doe');
extract($_POST);
echo $address;
echo $name
Run Code Online (Sandbox Code Playgroud)
在PYTHON中是否有类似extract()的函数?????
字典也一样:
mydict = {'raw':'data', 'code': 500}
// some magic to extract raw and code as vars
print raw
Run Code Online (Sandbox Code Playgroud)
ps为什么我要这样做:当你在类方法时,当string是self.data ['raw'] ['code']时,很难在join()和format()中使用字符串进行6次操作.假设它在这里的字典中是dict)
注意:我已将这篇文章浓缩到我的人wiki:http://wiki.chacha102.com/Lambda-享受
我在PHP中使用Lambda样式函数时遇到了一些麻烦.
首先,这个作品:
$foo = function(){ echo "bar"; };
$foo();
Run Code Online (Sandbox Code Playgroud)
二,本作品:
class Bar{
public function foo(){
echo "Bar";
}
Run Code Online (Sandbox Code Playgroud)
第三,这有效:
$foo = new stdClass;
$foo->bar = function(){ echo "bar"; };
$test = $foo->bar;
$test();
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用:
$foo = new stdClass;
$foo->bar = function(){ echo "bar"; };
$foo->bar();
Run Code Online (Sandbox Code Playgroud)
而且,这不起作用
class Bar{
public function foo(){
echo "Bar";
}
$foo = new Bar;
$foo->foo = function(){ echo "foo"; };
$foo->foo(); // echo's bar instead of Foo.
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么?,我怎么能保证这两点:
$foo->bar = …Run Code Online (Sandbox Code Playgroud) 假设我们有以下设置(从Hydra 文档中复制和缩短):
配置文件: config.yaml
db:
driver: mysql
user: omry
pass: secret
Run Code Online (Sandbox Code Playgroud)
蟒文件: my_app.py
import hydra
@hydra.main(config_path="config.yaml")
def my_app(cfg):
print(cfg.pretty())
if __name__ == "__main__":
my_app()
Run Code Online (Sandbox Code Playgroud)
当我们可以在函数上使用装饰器时,这很有效my_app。现在我想(为了小脚本和测试目的,但这并不重要)cfg在任何函数之外获取这个对象,只是在一个普通的 python 脚本中。据我了解装饰器的工作原理,应该可以调用
import hydra
cfg = hydra.main(config_path="config.yaml")(lambda x: x)()
print(cfg.pretty())
Run Code Online (Sandbox Code Playgroud)
但 thencfg只是None而不是所需的配置对象。所以看起来装饰器没有传递返回值。有没有另一种方法可以做到这一点cfg?
标准的python json模块只能将json字符串转换为dict结构.
但我更喜欢将json转换为具有"父子关系"的模型对象结构.
我在Android应用程序中使用google-gson,但不知道哪个python库可以执行此操作.
我在使用字典填充表单时遇到问题:
row = {'firstname':'Bob', 'lastname': "Smith",
'email': 'bob@bubba.com', 'phone': '512.999.1212'}
form = RolodexEntry(obj=row)
Run Code Online (Sandbox Code Playgroud)
不会将任何数据放入表单中(即form.firstname.data =之前的无).
表单定义的顶部如下所示.我不知道下一步该尝试什么.表单文档只是说:
obj - 如果formdata为空或未提供,则检查此对象是否存在与表单字段名称匹配的属性,这些属性将用于字段值.
class RolodexEntry(Form):
firstname = TextField('First Name',[validators.length(max=40)],
filters=[strip_filter])
lastname = TextField('Last Name', [validators.length(max=40)],
filters=[strip_filter])
email = TextField('Email', [validators.Optional(),
validators.length(max=25),
validators.Email()],
filters=[strip_filter])
...
Run Code Online (Sandbox Code Playgroud) 我开始学习python已经很久了,但我真的很想深入研究它.并努力挖掘.所以这是一个我已经研究了一段时间但尚未破解的任务:
我给出了嵌套字典和列表的混合组合(让我们称之为" 组合 "),我需要实现允许访问的函数嵌套元素作为对象属性,也以某种方式将组合元素视为可迭代.这应该是这样的:
combination = {
'item1': 3.14,
'item2': 42,
'items': [
'text text text',
{
'field1': 'a',
'field2': 'b',
},
{
'field1': 'c',
'field2': 'd',
},
]
}
def function(combination):
...
Run Code Online (Sandbox Code Playgroud)
这
list(function(combination).items.field1)
将给予:['a', 'c'],
list(function(combination).item1)并将给予:[3.14].
编辑正如@FM所提到的,我错过了处理非字典元素的描述:
list(function(combination).items[0])>>>['text text text']
我尝试实现一个类(对Marc的称赞)来帮助我:
class Struct:
def __init__(self, **entries):
self.__dict__.update(entries)
Run Code Online (Sandbox Code Playgroud)
然后在使用它的功能等return Struct(**combination)
虽然是非常漂亮的,这仅仅是第一步所期望的结果.
但是,随着下一步需要更深入,它会压倒我,我不能自己做.
因此,我请求你的帮助.
迈克尔.
我目前正在与 WSDL 进行集成,因此决定使用 Zeep 库与 Python 一起使用。
我正在尝试使用 对响应进行建模mypy,以便它可以与 VSCode 的 Intellisense 配合使用,并且在我进行粗心的分配或修改时也会给我一些提示。但是,当 WSDL 响应位于嵌套对象中时,我遇到了障碍,而且我无法找到对其进行类型提示的方法。
来自 WSDL 的示例响应:
{
'result': {
'code': '1',
'description': 'Success',
'errorUUID': None
},
'accounts': {
'accounts': [
{
'accountId': 1,
'accountName': 'Ming',
'availableCredit': 1
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用以下代码段进行类型提示:
{
'result': {
'code': '1',
'description': 'Success',
'errorUUID': None
},
'accounts': {
'accounts': [
{
'accountId': 1,
'accountName': 'Ming',
'availableCredit': 1
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
对于尝试 1,原因很明显。但是在尝试了尝试 2 之后,我不知道如何继续了。我在这里缺少什么?
更新:按照@Avi Kaminetzky 的回答,我尝试了以下( …
我正在使用之前讨论过的一种技术,将字典转换为对象,以便我可以使用点 (.) 概念访问字典的元素,作为实例变量。
这就是我正在做的:
# Initial dictionary
myData = {'apple':'1', 'banana':'2', 'house':'3', 'car':'4', 'hippopotamus':'5'}
# Create the container class
class Struct:
def __init__(self, **entries):
self.__dict__.update(entries)
# Finally create the instance and bind the dictionary to it
k = Struct(**myData)
Run Code Online (Sandbox Code Playgroud)
所以现在,我可以这样做:
print k.apple
Run Code Online (Sandbox Code Playgroud)
结果是:
1
Run Code Online (Sandbox Code Playgroud)
这有效,但是如果我尝试向“Struct”类添加一些其他方法,问题就会开始。例如,假设我添加了一个仅创建变量的简单方法:
class Struct:
def __init__(self, **entries):
self.__dict__.update(entries)
def testMe(self):
self.myVariable = 67
Run Code Online (Sandbox Code Playgroud)
如果我做:
k.testMe()
Run Code Online (Sandbox Code Playgroud)
我的字典对象坏了,“myVariable”作为键插入,值为“67”。所以如果我这样做:
print k.__dict__
Run Code Online (Sandbox Code Playgroud)
我正进入(状态:
{'apple': '1', 'house': '3', 'myVariable': 67, 'car': '4', 'banana': '2', 'hippopotamus': '5'}
Run Code Online (Sandbox Code Playgroud)
有没有办法来解决这个问题?我有点明白发生了什么,但不确定是否需要完全改变我的方法并构建一个带有内部方法的类来处理字典对象,还是有更简单的方法来解决这个问题?
这是原始链接: Convert Python dict to …
现在我正在使用python.关于dict的一个问题....假设我有一个字典
config = {'account_receivable': '4', 'account_payable': '5', 'account_cogs': '8', 'accoun
t_retained_earning': '9', 'account_income': '6', 'account_expense': '31', 'durat
ion': 2, 'financial_year_month': 9, 'financial_year_day': 15, 'account_cash': '3
', 'account_inventory': '2', 'account_accumulated_depriciation': '34', 'account_
depriciation_expense': '35', 'account_salary_expense': '30', 'account_payroll_pa
yable': '68', 'account_discount': '36', 'financial_year_close': '2008-08-08'}
Run Code Online (Sandbox Code Playgroud)
如果print - > config ['account_receivable']它将返回其对应的值4
但我希望通过这种方式访问它 - > config.account_receivable,然后它将返回相应的值
我怎么能实现这个??? 如果有人可以请帮助我
BR //纳兹穆尔
假设我正在记录数据并想要关联一些数据元素,这样每个记录集总是具有固定的组合,即没有丢失的字段.
我作为程序员的大多数经验都是使用Ada或C/C++变体.在Ada中,我将使用记录类型和聚合赋值,以便在使用新字段更新记录类型时,编译器将通知使用该记录的任何人.在C++中,我可能会使用存储类和构造函数来做类似的事情.
在Python中处理类似情况的适当方法是什么?这是一个类是正确答案的情况,还是比Ada记录的重量更轻?
另外一个想法,Ada记录和C++构造函数都允许默认初始化值.是否有上述问题的Python解决方案也提供了该功能?
我有这个从API获取的嵌套字典。
response_body = \
{
u'access_token':u'SIF_HMACSHA256lxWT0K',
u'expires_in':86000,
u'name':u'Gandalf Grey',
u'preferred_username':u'gandalf',
u'ref_id':u'ab1d4237-edd7-4edd-934f-3486eac5c262',
u'refresh_token':u'eyJhbGciOiJIUzI1N',
u'roles':u'Instructor',
u'sub':{
u'cn':u'Gandalf Grey',
u'dc':u'7477',
u'uid':u'gandalf',
u'uniqueIdentifier':u'ab1d4237-edd7-4edd-934f-3486eac5c262'
}
}
Run Code Online (Sandbox Code Playgroud)
我使用以下代码将其转换为Python对象:
class sample_token:
def __init__(self, **response):
self.__dict__.update(response)
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
s = sample_token(**response_body)
Run Code Online (Sandbox Code Playgroud)
在此之后,我可以通过访问值s.access_token,s.name等等。但是价值c.sub也是一本字典。如何使用此技术获取嵌套字典的值?即s.sub.cn返回Gandalf Grey。
假设我有一个URL如下:
http://sitename.com/pathname?title=moviename&url=VIDEO_URL
Run Code Online (Sandbox Code Playgroud)
我想解析这个URL,分别单独获取标题部分和url部分.
我试过以下,
from urlparse import urlparse
q = urlparse('http://sitename.com/pathname?title=moviename&url=VIDEO_URL')
Run Code Online (Sandbox Code Playgroud)
在我这样做之后,我得到以下结果,
q
ParseResult(scheme='http', netloc='sitename.com', path='/pathname', params='', query='title=moviename&url=VIDEO_URL', fragment='')
Run Code Online (Sandbox Code Playgroud)
并且q.query,
'title=moviename&url=VIDEO_URL'
Run Code Online (Sandbox Code Playgroud)
我无法在这里使用q.query.title或q.query.url.有没有办法可以访问它?我想将url和title部分分开分成不同的列.我们可以这样做吗或者我们可以编写一个子字符串方法来检查以"title"开头并以"&"结尾并拆分它吗?
谢谢
python ×10
dictionary ×3
json ×2
python-3.x ×2
ada ×1
c++ ×1
class ×1
extract ×1
fb-hydra ×1
hydra-python ×1
lambda ×1
mypy ×1
oop ×1
php ×1
python-2.7 ×1
record ×1
type-hinting ×1
urlparse ×1
variables ×1
wtforms ×1
zeep ×1