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)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
datetime如何使用JodaTime在Java中设置时间属性   java固定算法的性能时间   java如何从JMenu中获取所选项以更改文本区域的文本颜色?   java配置单元UDF传递数组<string>作为参数   javaapachebeam和BigQuery   java与PrintWriter之间的差异。printf和PrintWriter。格式方法   继承如何处理按Java版本更改的导入,以及在多个版本上编译   xml java。lang.noClassDefFoundant生成错误   java如何使用包含映射的JSON发送POST请求?   java如何在任何应用程序的JAR文件中绑定MySql数据库?   Java脚本解释器   sslhttpclientjava。网SocketException:未实现未连接的socket   java如何为Android应用程序创建类似于Cron作业的东西   java JButton+radiobox+复选框   java内存管理将文件写入内存   java这是计算对象实例的有效方法吗?   用于死锁情况的java代码?   JavaSpring容器作为新实体插入,而不是存储在表中