multistring是一个允许字符串根据上下文具有不同含义的类。
MultiString的Python项目详细描述
##目录
+[什么是多字符串?](多字符串)
+[更改日志](更改日志)
+[创建多字符串](创建)
+[字符串用法](字符串用法)
+[上下文](上下文)
+[翻译](翻译)
+[定义翻译](翻译定义)
+[翻译上下文](翻译上下文)
+[上下文访问](上下文访问)
+[gotchas](gotchas)
+[我为什么要用这个?](whythehell)
+[测试](测试)
+[安装](安装)
<;a name="multistring">;
multistring
multistring是一个python类,它允许单个字符串在许多不同的上下文中操作。一个很好的例子是用许多不同的语言对同一个字符串进行
交换。
multistring对象本身可以使用任何有效的string方法,并且
该方法只会影响当前活动的上下文,这意味着
multistring可以与任何现有代码一样使用。此外,
多字符串非常保护它们的上下文。不活动的上下文
不能以任何方式操作,从而防止意外地覆盖有价值的信息。
multistring还提供动态转换上下文的绑定。
multistring完全支持切片和连接,
甚至使用本机的"reversed"函数返回字符串
向后。
<;a name="changelog">;
现在可以传入"active"参数来设置初始上下文
+如果用户传入,则修复未设置的初始字符串
+在引发nullvalueexception时修复输入错误
+修复不使用pip生成
<;a name="creation">;<;/a>;
创建
创建多字符串时,必须至少提供一个上下文。
如果愿意,还可以为每个上下文传入定义的翻译。
创建多字符串对象有四种有效方法:
=多字符串("en","这是英语")
并将第一个字符串设置为active
stagedwithdefault=multistring(("en","de","sp"),"this is english")
"en":"this is english"、
"de":"dieser is deutsch"、
"sp":"este es el espanol"
})
在所有情况下,"default"参数都是可选的(如果在字典中传递
,则将被忽略)。
<;a name="StringUsage">;
如果您尝试调用multistring类不提供的任何方法,它将尝试对其当前活动字符串itstead调用该方法。"this is english")
multistring.upper()返回"this is english"
multistring.upper()==multistring.en.upper()
multistring+=",这是另一个子句。"
print multistring print s"这是英语,还有一个子句'
这些操作只影响活动上下文。例如:
假设'en'仍处于活动状态
multistring.addContext('de','guten tag!')
多字符串+="。还有这个。"
print multistring prints"这是英语。这也是"
print multistring.en prints"这是英文。还有这个。"
print multistring.de prints"guten tag!"
这意味着在当前上下文中,您可以正常控制,但您不会影响字符串的任何其他上下文。
<;a name="contexts">;
contexts
contexts是只读的,除非它们处于活动状态,并且默认为"无"。
以后可能不会重新定义contexts,如果您尝试,将抛出一个错误。
它们也不能与多字符串的任何其他属性相同。
同样,这是为了保护您的数据!
multistring=multistring(('en','de'),"这是英语。")
multistring.addContext('en',"woops!")误差。上下文已经存在。
multistring.de="deutsch!"#错误,因为"en"是活动的
multistring.en="这很酷。""好吧,因为我们正在操作活动上下文
print(multistring.de)"none"
multistring.someproperty=17"没问题!
多字符串.someproperty=29没问题!
multistring.addContext('someProperty')错误!你会后悔的!
<;a name="translating">;
<;a name="Translating Defining">;
定义翻译
您可以在任何两个定义的上下文之间添加翻译。必须为"addTranslation"方法提供
三个参数:
addTranslate(fromContext,toContext,回调)
lambda s:base64.b64encode(s))
multistring.addtranslation('b64','en',lambda s:base64.b64decode(s))
<;a name="translating contexts">;
翻译时,您还可以选择存储这些翻译,
或根据特殊情况重写翻译协议。
multistring.active('en')
multistring.en="这里有些英语"
由于"b64"上下文当前为空,
它将把翻译存储在"b64"上下文中,并返回它。
en_to_b64=multistring.translate('b64')
en_to_b64==multistring.b64=true
默认情况下不会保留结果,为了防止您丢失数据:
multistring.en="其他一些英语"
en_to_b64=multistring.translate('b64')
en_to_b64==multistring.b64=false
=multistring.translate('b64',overwrite_stored廑value)
en廑u to廑u b64==multistring.b64廑true
只要目标上下文是预先定义的。
en_to_b64=multistring.translate('b64',override_translation_protocol,lambda s:"只是开玩笑!")
en_to_b64==multistring.b64 false
en_to_b64=multistring.translate('b64',override_translation_protocol overwrite_stored_value,lambda s:"开玩笑!")
en_to_b64==multistring.b64 true
如果此上下文中不存在翻译
,则如果提供翻译,则会自动添加该翻译:
multistring.en="这里有一些字母和数字:abcdef4815162342"
multistring.addContext('letters')
letters=multistring.translate('letters',callback=lambda s:".join([char for char in s if char in string.ascii\letters])
letters==multistring.letters\true
letters=="heressomelettersandnumbersabcdef"\true
multistring.addContext('only8')
multistring.active('letters')
multistring.translate('only8',callback=lambda s:s[:8])="heressom"
multistring.active('en')
multistring.translate('only8')='这里是's'
<;a name="contextaccess">;<;/a>;
上下文访问
可以像读取类的任何其他属性一样读取上下文。
multistring.addContext('foo','bar')
print multistring.foo 35;'bar'
multistring="再见,残酷的世界!"不!您的multistring将被破坏
,相反,您必须分配上下文本身(并且只有活动的上下文):
multistring=multistring('en',"hello,world!")
multistring.en="再见,残酷的世界!"#好得多的
"str()"方法将始终引用活动的上下文。这是故意的行为。但是,您可以使用点运算符在其他上下文中调用此方法:
multistring.active('en')
str(multistring)==multistring.en true
str(multistring.de)==multistring.de true,如果"de"不是none,则print(multistring)将打印活动上下文,因为multistring尽可能遵从本机字符串方法,以允许将对多字符串对象的支持减少到当前代码中,很难
访问多字符串属性本身,因为它们被其"str"对应项屏蔽了。
<;a name="why the hell">;
#
如果您有一个正在被翻译成其他语言的系统,那么多字符串可以是一种有价值的方法,它可以在不必重新连接整个系统的情况下替换语法。例如:
\ n"
sys.stderr.write(errormessage)
只有当你的听众讲英语时,这才有用。
u输入多字符串:
"en":"所有人都赞美伟大的一个!让他站起来,为我们编织新的梦想!"",
"piglatin":"所有的葡萄干都是灰色的!
"克图利安":"ia!啊!克图尔胡夫塔根!"
})
errorMessage.active(用户首选语言)
sys.stderr.write(errorMessage+"\n")
您还可以无缝地集成另一个api,以本机方式为您处理翻译:
multi.addcontext(user.preferred廑language)
它接受
一个语言代码和一些文本作为参数
multi.translate(user.preferred廑language,lambda s:someapi.sendcall(user.preferred廑language,multi.active())
multi.active(用户首选语言)
mypytocpmodule)
multi.addtranslation('cpp','py',mycpptopymodule)
multi.py="打印(您好世界!)BR/>多翻译('CPP’)的返回:STD::CUT & LT;& lt;"Hello World!"STD::'BR/>多活动('CPP)
多翻译(‘Py’)=(多)Py。您可以运行"python multistringuittest.py"来运行基本测试。如果其中任何一个失败了,请告诉我,否则您会发现
测试不包括但应该包括的任何内容!
<;a name="installing">;
由于这是一个单独的类,您可以简单地按原样导入它。
但是,如果您希望将其安装到python的路径上,您可以使用
python setup.py install
这将影响您的命名空间。
<;a name="license">;<;/a>;
GNU通用公共许可证由BR/>自由软件基金会发布,许可证的3版本,或BR/>(按您的选择)任何后续版本。
BR/>此程序被分发,希望它有用,
但无任何保证;甚至没有
适销性或特定用途适用性的隐含保证。有关详细信息,请参阅gnu通用公共许可证。
如果没有,请参见http://www.gnu.org/licenses/>;
<;a name="credits">;
[tom a.thorogood](http://www.github.com/tomthorogood)
[jonathan eunice](http://www.github.com/jonathaneunice)
+[什么是多字符串?](多字符串)
+[更改日志](更改日志)
+[创建多字符串](创建)
+[字符串用法](字符串用法)
+[上下文](上下文)
+[翻译](翻译)
+[定义翻译](翻译定义)
+[翻译上下文](翻译上下文)
+[上下文访问](上下文访问)
+[gotchas](gotchas)
+[我为什么要用这个?](whythehell)
+[测试](测试)
+[安装](安装)
<;a name="multistring">;
multistring
multistring是一个python类,它允许单个字符串在许多不同的上下文中操作。一个很好的例子是用许多不同的语言对同一个字符串进行
交换。
multistring对象本身可以使用任何有效的string方法,并且
该方法只会影响当前活动的上下文,这意味着
multistring可以与任何现有代码一样使用。此外,
多字符串非常保护它们的上下文。不活动的上下文
不能以任何方式操作,从而防止意外地覆盖有价值的信息。
multistring还提供动态转换上下文的绑定。
multistring完全支持切片和连接,
甚至使用本机的"reversed"函数返回字符串
向后。
<;a name="changelog">;
现在可以传入"active"参数来设置初始上下文
+如果用户传入,则修复未设置的初始字符串
+在引发nullvalueexception时修复输入错误
+修复不使用pip生成
<;a name="creation">;<;/a>;
创建
创建多字符串时,必须至少提供一个上下文。
如果愿意,还可以为每个上下文传入定义的翻译。
创建多字符串对象有四种有效方法:
=多字符串("en","这是英语")
并将第一个字符串设置为active
stagedwithdefault=multistring(("en","de","sp"),"this is english")
"en":"this is english"、
"de":"dieser is deutsch"、
"sp":"este es el espanol"
})
在所有情况下,"default"参数都是可选的(如果在字典中传递
,则将被忽略)。
<;a name="StringUsage">;
如果您尝试调用multistring类不提供的任何方法,它将尝试对其当前活动字符串itstead调用该方法。"this is english")
multistring.upper()返回"this is english"
multistring.upper()==multistring.en.upper()
multistring+=",这是另一个子句。"
print multistring print s"这是英语,还有一个子句'
这些操作只影响活动上下文。例如:
假设'en'仍处于活动状态
multistring.addContext('de','guten tag!')
多字符串+="。还有这个。"
print multistring prints"这是英语。这也是"
print multistring.en prints"这是英文。还有这个。"
print multistring.de prints"guten tag!"
这意味着在当前上下文中,您可以正常控制,但您不会影响字符串的任何其他上下文。
<;a name="contexts">;
contexts
contexts是只读的,除非它们处于活动状态,并且默认为"无"。
以后可能不会重新定义contexts,如果您尝试,将抛出一个错误。
它们也不能与多字符串的任何其他属性相同。
同样,这是为了保护您的数据!
multistring=multistring(('en','de'),"这是英语。")
multistring.addContext('en',"woops!")误差。上下文已经存在。
multistring.de="deutsch!"#错误,因为"en"是活动的
multistring.en="这很酷。""好吧,因为我们正在操作活动上下文
print(multistring.de)"none"
multistring.someproperty=17"没问题!
多字符串.someproperty=29没问题!
multistring.addContext('someProperty')错误!你会后悔的!
<;a name="translating">;
<;a name="Translating Defining">;
定义翻译
您可以在任何两个定义的上下文之间添加翻译。必须为"addTranslation"方法提供
三个参数:
addTranslate(fromContext,toContext,回调)
lambda s:base64.b64encode(s))
multistring.addtranslation('b64','en',lambda s:base64.b64decode(s))
<;a name="translating contexts">;
翻译时,您还可以选择存储这些翻译,
或根据特殊情况重写翻译协议。
multistring.active('en')
multistring.en="这里有些英语"
由于"b64"上下文当前为空,
它将把翻译存储在"b64"上下文中,并返回它。
en_to_b64=multistring.translate('b64')
en_to_b64==multistring.b64=true
默认情况下不会保留结果,为了防止您丢失数据:
multistring.en="其他一些英语"
en_to_b64=multistring.translate('b64')
en_to_b64==multistring.b64=false
=multistring.translate('b64',overwrite_stored廑value)
en廑u to廑u b64==multistring.b64廑true
只要目标上下文是预先定义的。
en_to_b64=multistring.translate('b64',override_translation_protocol,lambda s:"只是开玩笑!")
en_to_b64==multistring.b64 false
en_to_b64=multistring.translate('b64',override_translation_protocol overwrite_stored_value,lambda s:"开玩笑!")
en_to_b64==multistring.b64 true
如果此上下文中不存在翻译
,则如果提供翻译,则会自动添加该翻译:
multistring.en="这里有一些字母和数字:abcdef4815162342"
multistring.addContext('letters')
letters=multistring.translate('letters',callback=lambda s:".join([char for char in s if char in string.ascii\letters])
letters==multistring.letters\true
letters=="heressomelettersandnumbersabcdef"\true
multistring.addContext('only8')
multistring.active('letters')
multistring.translate('only8',callback=lambda s:s[:8])="heressom"
multistring.active('en')
multistring.translate('only8')='这里是's'
<;a name="contextaccess">;<;/a>;
上下文访问
可以像读取类的任何其他属性一样读取上下文。
multistring.addContext('foo','bar')
print multistring.foo 35;'bar'
multistring="再见,残酷的世界!"不!您的multistring将被破坏
,相反,您必须分配上下文本身(并且只有活动的上下文):
multistring=multistring('en',"hello,world!")
multistring.en="再见,残酷的世界!"#好得多的
"str()"方法将始终引用活动的上下文。这是故意的行为。但是,您可以使用点运算符在其他上下文中调用此方法:
multistring.active('en')
str(multistring)==multistring.en true
str(multistring.de)==multistring.de true,如果"de"不是none,则print(multistring)将打印活动上下文,因为multistring尽可能遵从本机字符串方法,以允许将对多字符串对象的支持减少到当前代码中,很难
访问多字符串属性本身,因为它们被其"str"对应项屏蔽了。
<;a name="why the hell">;
#
如果您有一个正在被翻译成其他语言的系统,那么多字符串可以是一种有价值的方法,它可以在不必重新连接整个系统的情况下替换语法。例如:
\ n"
sys.stderr.write(errormessage)
只有当你的听众讲英语时,这才有用。
u输入多字符串:
"piglatin":"所有的葡萄干都是灰色的!
"克图利安":"ia!啊!克图尔胡夫塔根!"
})
errorMessage.active(用户首选语言)
sys.stderr.write(errorMessage+"\n")
您还可以无缝地集成另一个api,以本机方式为您处理翻译:
它接受
一个语言代码和一些文本作为参数
multi.translate(user.preferred廑language,lambda s:someapi.sendcall(user.preferred廑language,multi.active())
multi.active(用户首选语言)
mypytocpmodule)
multi.addtranslation('cpp','py',mycpptopymodule)
multi.py="打印(您好世界!)BR/>多翻译('CPP’)的返回:STD::CUT & LT;& lt;"Hello World!"STD::'BR/>多活动('CPP)
多翻译(‘Py’)=(多)Py。您可以运行"python multistringuittest.py"来运行基本测试。如果其中任何一个失败了,请告诉我,否则您会发现
测试不包括但应该包括的任何内容!
<;a name="installing">;
由于这是一个单独的类,您可以简单地按原样导入它。
但是,如果您希望将其安装到python的路径上,您可以使用
python setup.py install
这将影响您的命名空间。
<;a name="license">;<;/a>;
GNU通用公共许可证由BR/>自由软件基金会发布,许可证的3版本,或BR/>(按您的选择)任何后续版本。
BR/>此程序被分发,希望它有用,
但无任何保证;甚至没有
适销性或特定用途适用性的隐含保证。有关详细信息,请参阅gnu通用公共许可证。
如果没有,请参见http://www.gnu.org/licenses/>;
<;a name="credits">;
[tom a.thorogood](http://www.github.com/tomthorogood)
[jonathan eunice](http://www.github.com/jonathaneunice)